unifi-cli 0.4.2__tar.gz → 0.4.4__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 (49) hide show
  1. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/.github/workflows/ci.yml +5 -5
  2. unifi_cli-0.4.4/.github/workflows/dependencies.yml +25 -0
  3. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/.github/workflows/release.yml +24 -17
  4. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/CHANGELOG.md +16 -0
  5. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/Cargo.lock +61 -51
  6. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/Cargo.toml +2 -2
  7. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/PKG-INFO +33 -8
  8. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/README.md +32 -7
  9. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/api/client.rs +263 -0
  10. unifi_cli-0.4.4/src/api/mod.rs +14 -0
  11. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/api/tests.rs +160 -0
  12. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/api/types.rs +490 -0
  13. unifi_cli-0.4.4/src/commands/dns.rs +434 -0
  14. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/mod.rs +1 -0
  15. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/fields.rs +14 -0
  16. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/lib.rs +4 -2
  17. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/main.rs +268 -0
  18. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/schema.rs +61 -5
  19. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/tests/cli_contract.rs +82 -1
  20. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/tests/mock_server.rs +398 -0
  21. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/tests/spec_compliance.rs +17 -2
  22. unifi_cli-0.4.2/.github/workflows/upd.yml +0 -19
  23. unifi_cli-0.4.2/src/api/mod.rs +0 -13
  24. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/.github/workflows/clispec.yml +0 -0
  25. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/.gitignore +0 -0
  26. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/.mise.toml +0 -0
  27. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/LICENSE +0 -0
  28. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/Makefile +0 -0
  29. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/docs/releases.md +0 -0
  30. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/prek.toml +0 -0
  31. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/pyproject.toml +0 -0
  32. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/clients.rs +0 -0
  33. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/devices.rs +0 -0
  34. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/events.rs +0 -0
  35. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/networks.rs +0 -0
  36. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/port_forwards.rs +0 -0
  37. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/ports.rs +0 -0
  38. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/protect.rs +0 -0
  39. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/system.rs +0 -0
  40. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/commands/wan.rs +0 -0
  41. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/output.rs +0 -0
  42. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/tui.rs +0 -0
  43. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/src/unifi_cli_alias.rs +0 -0
  44. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/tests/fixtures/clispec-v0.3.json +0 -0
  45. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/tests/no_real_network_data.rs +0 -0
  46. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/tests/package_alias.rs +0 -0
  47. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/unifi_cli/__init__.py +0 -0
  48. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/unifi_cli/__main__.py +0 -0
  49. {unifi_cli-0.4.2 → unifi_cli-0.4.4}/vership.toml +0 -0
@@ -15,7 +15,7 @@ jobs:
15
15
  name: Lint
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
18
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
19
19
 
20
20
  - uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c
21
21
  with:
@@ -29,7 +29,7 @@ jobs:
29
29
  name: Test
30
30
  runs-on: ubuntu-latest
31
31
  steps:
32
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
32
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
33
33
 
34
34
  - uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c
35
35
  with:
@@ -42,18 +42,18 @@ jobs:
42
42
  name: Coverage
43
43
  runs-on: ubuntu-latest
44
44
  steps:
45
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
45
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
46
46
  - uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c
47
47
  with:
48
48
  toolchain: 1.96.0
49
49
  components: rustfmt, clippy
50
- - uses: taiki-e/install-action@82cd3e7658a6f96c86c0234aeeda1748937cb0a1
50
+ - uses: taiki-e/install-action@3f74d7c16a4242f1c95561e98edc25d36adb4375 # v2.87.12
51
51
  with:
52
52
  tool: cargo-tarpaulin
53
53
  - name: Generate coverage
54
54
  run: cargo tarpaulin --out xml
55
55
  - name: Upload to Codecov
56
- uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f
56
+ uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
57
57
  with:
58
58
  files: cobertura.xml
59
59
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -0,0 +1,25 @@
1
+ name: Dependency health
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "51 6 * * 1"
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ id-token: write
11
+ packages: read
12
+ pull-requests: read
13
+
14
+ jobs:
15
+ update:
16
+ uses: rvben/upd/.github/workflows/dependency-health.yml@a6335d64643d55ae6c04bcc961b964147075eb92 # v0.10.4
17
+ with:
18
+ langs: rust,actions
19
+ lock: true
20
+ min-age: 7d
21
+ max-bump: minor
22
+ validation-command: make check
23
+ fail-on-blocked: false
24
+ branch: deps/upd
25
+ commit-message: "chore(deps): refresh dependencies"
@@ -37,7 +37,7 @@ jobs:
37
37
  name: Run tests
38
38
  runs-on: ubuntu-latest
39
39
  steps:
40
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
40
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
41
41
 
42
42
  - name: Validate release metadata
43
43
  shell: bash
@@ -89,7 +89,7 @@ jobs:
89
89
  target: aarch64-apple-darwin
90
90
  runs-on: ${{ matrix.os }}
91
91
  steps:
92
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
92
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
93
93
  with:
94
94
  # Preserve target/ between runs on self-hosted runners for cargo
95
95
  # incremental rebuild. GitHub-hosted runners start clean each job
@@ -128,7 +128,7 @@ jobs:
128
128
 
129
129
  - name: Install uv
130
130
  if: matrix.target != 'aarch64-unknown-linux-gnu'
131
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
131
+ uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
132
132
 
133
133
  - name: Install maturin and zig
134
134
  # maturin-action provides its own maturin inside the manylinux
@@ -145,7 +145,7 @@ jobs:
145
145
 
146
146
  - name: Build wheel (arm64 linux via maturin-action)
147
147
  if: matrix.target == 'aarch64-unknown-linux-gnu'
148
- uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b
148
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
149
149
  with:
150
150
  target: aarch64-unknown-linux-gnu
151
151
  args: --release --out dist
@@ -227,13 +227,13 @@ jobs:
227
227
  rm -rf release-package
228
228
 
229
229
  - name: Upload wheel
230
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
230
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
231
231
  with:
232
232
  path: dist/*.whl
233
233
  name: wheel-${{ matrix.target }}
234
234
 
235
235
  - name: Upload release archives
236
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
236
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
237
237
  with:
238
238
  path: |
239
239
  unifi-cli-${{ github.ref_name }}-${{ matrix.target }}.tar.gz*
@@ -245,9 +245,9 @@ jobs:
245
245
  runs-on: ubuntu-latest
246
246
  needs: test
247
247
  steps:
248
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
248
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
249
249
 
250
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
250
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
251
251
 
252
252
  - name: Install maturin
253
253
  shell: bash
@@ -261,7 +261,7 @@ jobs:
261
261
  - name: Build sdist
262
262
  run: maturin sdist
263
263
 
264
- - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
264
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
265
265
  with:
266
266
  path: target/wheels/*.tar.gz
267
267
  name: sdist
@@ -270,23 +270,30 @@ jobs:
270
270
  runs-on: ubuntu-latest
271
271
  permissions:
272
272
  contents: write
273
+ id-token: write
273
274
  needs: [build, sdist]
274
275
  steps:
275
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
276
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
276
277
 
277
278
  - uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c
278
279
  with:
279
280
  toolchain: 1.96.0
280
281
  components: rustfmt, clippy
281
282
  - name: Install uv
282
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
283
+ uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
283
284
  with:
284
285
  enable-cache: false
285
286
 
287
+ - name: Authenticate to crates.io via Trusted Publishing
288
+ id: crates_io_auth
289
+ if: ${{ inputs.dry_run != true && inputs.skip_crates_io != true }}
290
+ # v1.0.5
291
+ uses: rust-lang/crates-io-auth-action@c6f97d42243bad5fab37ca0427f495c86d5b1a18 # v1.0.5
292
+
286
293
  - name: Publish to crates.io
287
294
  if: ${{ inputs.dry_run != true && inputs.skip_crates_io != true }}
288
295
  env:
289
- CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
296
+ CARGO_REGISTRY_TOKEN: ${{ steps.crates_io_auth.outputs.token }}
290
297
  run: cargo publish --locked
291
298
 
292
299
  - name: Test crates.io publish (dry run)
@@ -300,7 +307,7 @@ jobs:
300
307
  run: echo "Skipping crates.io publishing as requested"
301
308
 
302
309
  - name: Download all artifacts
303
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
310
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
304
311
  with:
305
312
  path: artifacts
306
313
 
@@ -326,7 +333,7 @@ jobs:
326
333
 
327
334
  - name: Create Release
328
335
  if: ${{ inputs.dry_run != true }}
329
- uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228
336
+ uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
330
337
  with:
331
338
  generate_release_notes: true
332
339
  files: |
@@ -347,7 +354,7 @@ jobs:
347
354
  if: ${{ !inputs.dry_run }}
348
355
  runs-on: ubuntu-latest
349
356
  steps:
350
- - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
357
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
351
358
  with:
352
359
  path: /tmp/artifacts
353
360
 
@@ -440,10 +447,10 @@ jobs:
440
447
  attestations: write
441
448
  steps:
442
449
  - name: Download release artifacts
443
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
450
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
444
451
  with:
445
452
  path: artifacts
446
453
  - name: Attest release artifacts
447
- uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6
454
+ uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
448
455
  with:
449
456
  subject-path: artifacts/**/*
@@ -2,6 +2,22 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.4.4](https://github.com/rvben/unifi-cli/compare/v0.4.3...v0.4.4) - 2026-09-27
6
+
7
+ ### Fixed
8
+
9
+ - **deps**: update rustls to 0.23.45 for RUSTSEC-2026-0285 ([4c1d51c](https://github.com/rvben/unifi-cli/commit/4c1d51c36bc77d4175d841bd0d2de3ac79ed6562))
10
+
11
+ ## [0.4.3](https://github.com/rvben/unifi-cli/compare/v0.4.2...v0.4.3) - 2026-09-17
12
+
13
+ ### Added
14
+
15
+ - **dns**: manage static DNS records ([149edf3](https://github.com/rvben/unifi-cli/commit/149edf379d1df00e79ea8c2b783c9895e4d7f74e))
16
+
17
+ ### Fixed
18
+
19
+ - **dns**: stop update from destroying records on v2 controllers ([445be02](https://github.com/rvben/unifi-cli/commit/445be02b5ab59dd04382ac93787afc407b7d4bd9))
20
+
5
21
  ## [0.4.2](https://github.com/rvben/unifi-cli/compare/v0.4.1...v0.4.2) - 2026-08-26
6
22
 
7
23
  ### Added
@@ -67,7 +67,7 @@ version = "1.1.5"
67
67
  source = "registry+https://github.com/rust-lang/crates.io-index"
68
68
  checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
69
69
  dependencies = [
70
- "windows-sys 0.61.2",
70
+ "windows-sys 0.60.2",
71
71
  ]
72
72
 
73
73
  [[package]]
@@ -78,14 +78,14 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
78
78
  dependencies = [
79
79
  "anstyle",
80
80
  "once_cell_polyfill",
81
- "windows-sys 0.61.2",
81
+ "windows-sys 0.60.2",
82
82
  ]
83
83
 
84
84
  [[package]]
85
85
  name = "anyhow"
86
- version = "1.0.102"
86
+ version = "1.0.104"
87
87
  source = "registry+https://github.com/rust-lang/crates.io-index"
88
- checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
88
+ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
89
89
 
90
90
  [[package]]
91
91
  name = "assert-json-diff"
@@ -236,6 +236,17 @@ version = "0.2.1"
236
236
  source = "registry+https://github.com/rust-lang/crates.io-index"
237
237
  checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
238
238
 
239
+ [[package]]
240
+ name = "chacha20"
241
+ version = "0.10.2"
242
+ source = "registry+https://github.com/rust-lang/crates.io-index"
243
+ checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06"
244
+ dependencies = [
245
+ "cfg-if",
246
+ "cpufeatures 0.3.1",
247
+ "rand_core 0.10.1",
248
+ ]
249
+
239
250
  [[package]]
240
251
  name = "clap"
241
252
  version = "4.6.1"
@@ -352,6 +363,15 @@ dependencies = [
352
363
  "libc",
353
364
  ]
354
365
 
366
+ [[package]]
367
+ name = "cpufeatures"
368
+ version = "0.3.1"
369
+ source = "registry+https://github.com/rust-lang/crates.io-index"
370
+ checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566"
371
+ dependencies = [
372
+ "libc",
373
+ ]
374
+
355
375
  [[package]]
356
376
  name = "crossterm"
357
377
  version = "0.29.0"
@@ -516,7 +536,7 @@ dependencies = [
516
536
  "libc",
517
537
  "option-ext",
518
538
  "redox_users",
519
- "windows-sys 0.61.2",
539
+ "windows-sys 0.59.0",
520
540
  ]
521
541
 
522
542
  [[package]]
@@ -567,7 +587,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
567
587
  checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
568
588
  dependencies = [
569
589
  "libc",
570
- "windows-sys 0.61.2",
590
+ "windows-sys 0.59.0",
571
591
  ]
572
592
 
573
593
  [[package]]
@@ -801,11 +821,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
801
821
  checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
802
822
  dependencies = [
803
823
  "cfg-if",
804
- "js-sys",
805
824
  "libc",
806
825
  "r-efi 5.3.0",
807
826
  "wasip2",
808
- "wasm-bindgen",
809
827
  ]
810
828
 
811
829
  [[package]]
@@ -815,17 +833,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
815
833
  checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
816
834
  dependencies = [
817
835
  "cfg-if",
836
+ "js-sys",
818
837
  "libc",
819
838
  "r-efi 6.0.0",
839
+ "rand_core 0.10.1",
820
840
  "wasip2",
821
841
  "wasip3",
842
+ "wasm-bindgen",
822
843
  ]
823
844
 
824
845
  [[package]]
825
846
  name = "h2"
826
- version = "0.4.14"
847
+ version = "0.4.19"
827
848
  source = "registry+https://github.com/rust-lang/crates.io-index"
828
- checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733"
849
+ checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16"
829
850
  dependencies = [
830
851
  "atomic-waker",
831
852
  "bytes",
@@ -1681,15 +1702,6 @@ version = "0.2.0"
1681
1702
  source = "registry+https://github.com/rust-lang/crates.io-index"
1682
1703
  checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
1683
1704
 
1684
- [[package]]
1685
- name = "ppv-lite86"
1686
- version = "0.2.21"
1687
- source = "registry+https://github.com/rust-lang/crates.io-index"
1688
- checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
1689
- dependencies = [
1690
- "zerocopy",
1691
- ]
1692
-
1693
1705
  [[package]]
1694
1706
  name = "prettyplease"
1695
1707
  version = "0.2.37"
@@ -1747,14 +1759,15 @@ dependencies = [
1747
1759
 
1748
1760
  [[package]]
1749
1761
  name = "quinn-proto"
1750
- version = "0.11.14"
1762
+ version = "0.11.18"
1751
1763
  source = "registry+https://github.com/rust-lang/crates.io-index"
1752
- checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098"
1764
+ checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc"
1753
1765
  dependencies = [
1754
1766
  "bytes",
1755
- "getrandom 0.3.4",
1767
+ "getrandom 0.4.2",
1756
1768
  "lru-slab",
1757
- "rand 0.9.4",
1769
+ "rand 0.10.3",
1770
+ "rand_pcg",
1758
1771
  "ring",
1759
1772
  "rustc-hash",
1760
1773
  "rustls",
@@ -1812,22 +1825,13 @@ dependencies = [
1812
1825
 
1813
1826
  [[package]]
1814
1827
  name = "rand"
1815
- version = "0.9.4"
1816
- source = "registry+https://github.com/rust-lang/crates.io-index"
1817
- checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
1818
- dependencies = [
1819
- "rand_chacha",
1820
- "rand_core 0.9.5",
1821
- ]
1822
-
1823
- [[package]]
1824
- name = "rand_chacha"
1825
- version = "0.9.0"
1828
+ version = "0.10.3"
1826
1829
  source = "registry+https://github.com/rust-lang/crates.io-index"
1827
- checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
1830
+ checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af"
1828
1831
  dependencies = [
1829
- "ppv-lite86",
1830
- "rand_core 0.9.5",
1832
+ "chacha20",
1833
+ "getrandom 0.4.2",
1834
+ "rand_core 0.10.1",
1831
1835
  ]
1832
1836
 
1833
1837
  [[package]]
@@ -1838,11 +1842,17 @@ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1838
1842
 
1839
1843
  [[package]]
1840
1844
  name = "rand_core"
1841
- version = "0.9.5"
1845
+ version = "0.10.1"
1842
1846
  source = "registry+https://github.com/rust-lang/crates.io-index"
1843
- checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
1847
+ checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
1848
+
1849
+ [[package]]
1850
+ name = "rand_pcg"
1851
+ version = "0.10.2"
1852
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1853
+ checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a"
1844
1854
  dependencies = [
1845
- "getrandom 0.3.4",
1855
+ "rand_core 0.10.1",
1846
1856
  ]
1847
1857
 
1848
1858
  [[package]]
@@ -2070,9 +2080,9 @@ dependencies = [
2070
2080
 
2071
2081
  [[package]]
2072
2082
  name = "rpassword"
2073
- version = "7.5.3"
2083
+ version = "7.5.4"
2074
2084
  source = "registry+https://github.com/rust-lang/crates.io-index"
2075
- checksum = "835a57a69104632d64deb0df2e09a69945cd7a6eab4070fc9b1d7e50cf6c3edc"
2085
+ checksum = "2da316a15f47e3d053de9cb2c439650bd8fa4aaeb9365f2e5f27f492ff73c196"
2076
2086
  dependencies = [
2077
2087
  "libc",
2078
2088
  "rtoolbox",
@@ -2114,14 +2124,14 @@ dependencies = [
2114
2124
  "errno",
2115
2125
  "libc",
2116
2126
  "linux-raw-sys",
2117
- "windows-sys 0.61.2",
2127
+ "windows-sys 0.59.0",
2118
2128
  ]
2119
2129
 
2120
2130
  [[package]]
2121
2131
  name = "rustls"
2122
- version = "0.23.40"
2132
+ version = "0.23.45"
2123
2133
  source = "registry+https://github.com/rust-lang/crates.io-index"
2124
- checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b"
2134
+ checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634"
2125
2135
  dependencies = [
2126
2136
  "once_cell",
2127
2137
  "ring",
@@ -2143,9 +2153,9 @@ dependencies = [
2143
2153
 
2144
2154
  [[package]]
2145
2155
  name = "rustls-webpki"
2146
- version = "0.103.13"
2156
+ version = "0.103.15"
2147
2157
  source = "registry+https://github.com/rust-lang/crates.io-index"
2148
- checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
2158
+ checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
2149
2159
  dependencies = [
2150
2160
  "ring",
2151
2161
  "rustls-pki-types",
@@ -2247,7 +2257,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2247
2257
  checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
2248
2258
  dependencies = [
2249
2259
  "cfg-if",
2250
- "cpufeatures",
2260
+ "cpufeatures 0.2.17",
2251
2261
  "digest",
2252
2262
  ]
2253
2263
 
@@ -2313,7 +2323,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2313
2323
  checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
2314
2324
  dependencies = [
2315
2325
  "libc",
2316
- "windows-sys 0.61.2",
2326
+ "windows-sys 0.60.2",
2317
2327
  ]
2318
2328
 
2319
2329
  [[package]]
@@ -2413,7 +2423,7 @@ dependencies = [
2413
2423
  "getrandom 0.4.2",
2414
2424
  "once_cell",
2415
2425
  "rustix",
2416
- "windows-sys 0.61.2",
2426
+ "windows-sys 0.59.0",
2417
2427
  ]
2418
2428
 
2419
2429
  [[package]]
@@ -2786,7 +2796,7 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
2786
2796
 
2787
2797
  [[package]]
2788
2798
  name = "unifi-cli"
2789
- version = "0.4.2"
2799
+ version = "0.4.4"
2790
2800
  dependencies = [
2791
2801
  "clap",
2792
2802
  "clap_complete",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "unifi-cli"
3
- version = "0.4.2"
3
+ version = "0.4.4"
4
4
  edition = "2024"
5
5
  rust-version = "1.90"
6
6
  description = "CLI for UniFi Network controller"
@@ -31,7 +31,7 @@ owo-colors = "4"
31
31
  dirs = "6"
32
32
  ratatui = "0.30"
33
33
  crossterm = "0.29"
34
- rpassword = "7.4.0"
34
+ rpassword = "7.5.4"
35
35
 
36
36
  [target.'cfg(unix)'.dependencies]
37
37
  libc = "0.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: unifi-cli
3
- Version: 0.4.2
3
+ Version: 0.4.4
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: System Administrators
@@ -137,16 +137,16 @@ to trust the controller and saves `accept_invalid_certs = true` for you.
137
137
  ### Destructive commands
138
138
 
139
139
  `clients block`, `clients unblock`, `clients kick`, `devices restart`,
140
- `devices upgrade`, `ports cycle` and `protect rtsps delete` all ask before they
141
- act. On a terminal you get a yes/no question naming the target; declining exits
142
- 2 with `kind: confirmation_required` and sends nothing. When stdin is not a
143
- terminal there is nobody to ask, so they refuse with the same error unless you
144
- pass `--yes`, which skips the question everywhere.
140
+ `devices upgrade`, `ports cycle`, `protect rtsps delete` and `dns delete` all
141
+ ask before they act. On a terminal you get a yes/no question naming the target;
142
+ declining exits 2 with `kind: confirmation_required` and sends nothing. When
143
+ stdin is not a terminal there is nobody to ask, so they refuse with the same
144
+ error unless you pass `--yes`, which skips the question everywhere.
145
145
 
146
146
  `unifi schema` marks exactly these commands `confirmation_required: true`, so a
147
147
  caller can tell them apart from mutating commands that act immediately
148
- (`devices locate`, `clients set-fixed-ip`, `protect rtsps create`) without
149
- hardcoding the list.
148
+ (`devices locate`, `clients set-fixed-ip`, `protect rtsps create`, `dns create`,
149
+ `dns update`) without hardcoding the list.
150
150
 
151
151
  ## TUI dashboard
152
152
 
@@ -283,6 +283,31 @@ unifi port-forwards list
283
283
  unifi port-forwards show plex
284
284
  ```
285
285
 
286
+ ### DNS records
287
+
288
+ Static DNS records the controller answers locally. Network 10.1+ uses the
289
+ official DNS-policies Integration API; older controllers fall back to the v2
290
+ `static-dns` API. Domain-forward policies are not listed.
291
+
292
+ ```bash
293
+ unifi dns list
294
+ unifi dns list --type A
295
+ unifi dns show nas.example.com
296
+ unifi dns create nas.example.com 192.0.2.10
297
+ unifi dns create printer.example.com 2001:db8::10 --type AAAA
298
+ unifi dns create media.example.com nas.example.com --type CNAME
299
+ unifi dns update nas.example.com --value 192.0.2.11
300
+ unifi dns delete nas.example.com
301
+ ```
302
+
303
+ `dns delete` is destructive and follows the same confirmation rules as
304
+ `clients block`. Create and update act immediately.
305
+
306
+ The v2 API has no PUT, so `dns update` is refused on a controller that falls
307
+ back to it. Editing a record there means `dns delete` followed by
308
+ `dns create`, which keeps the delete explicit and confirmed instead of hiding
309
+ it inside an update that cannot undo it when the create fails.
310
+
286
311
  ### Events
287
312
 
288
313
  ```bash
@@ -116,16 +116,16 @@ to trust the controller and saves `accept_invalid_certs = true` for you.
116
116
  ### Destructive commands
117
117
 
118
118
  `clients block`, `clients unblock`, `clients kick`, `devices restart`,
119
- `devices upgrade`, `ports cycle` and `protect rtsps delete` all ask before they
120
- act. On a terminal you get a yes/no question naming the target; declining exits
121
- 2 with `kind: confirmation_required` and sends nothing. When stdin is not a
122
- terminal there is nobody to ask, so they refuse with the same error unless you
123
- pass `--yes`, which skips the question everywhere.
119
+ `devices upgrade`, `ports cycle`, `protect rtsps delete` and `dns delete` all
120
+ ask before they act. On a terminal you get a yes/no question naming the target;
121
+ declining exits 2 with `kind: confirmation_required` and sends nothing. When
122
+ stdin is not a terminal there is nobody to ask, so they refuse with the same
123
+ error unless you pass `--yes`, which skips the question everywhere.
124
124
 
125
125
  `unifi schema` marks exactly these commands `confirmation_required: true`, so a
126
126
  caller can tell them apart from mutating commands that act immediately
127
- (`devices locate`, `clients set-fixed-ip`, `protect rtsps create`) without
128
- hardcoding the list.
127
+ (`devices locate`, `clients set-fixed-ip`, `protect rtsps create`, `dns create`,
128
+ `dns update`) without hardcoding the list.
129
129
 
130
130
  ## TUI dashboard
131
131
 
@@ -262,6 +262,31 @@ unifi port-forwards list
262
262
  unifi port-forwards show plex
263
263
  ```
264
264
 
265
+ ### DNS records
266
+
267
+ Static DNS records the controller answers locally. Network 10.1+ uses the
268
+ official DNS-policies Integration API; older controllers fall back to the v2
269
+ `static-dns` API. Domain-forward policies are not listed.
270
+
271
+ ```bash
272
+ unifi dns list
273
+ unifi dns list --type A
274
+ unifi dns show nas.example.com
275
+ unifi dns create nas.example.com 192.0.2.10
276
+ unifi dns create printer.example.com 2001:db8::10 --type AAAA
277
+ unifi dns create media.example.com nas.example.com --type CNAME
278
+ unifi dns update nas.example.com --value 192.0.2.11
279
+ unifi dns delete nas.example.com
280
+ ```
281
+
282
+ `dns delete` is destructive and follows the same confirmation rules as
283
+ `clients block`. Create and update act immediately.
284
+
285
+ The v2 API has no PUT, so `dns update` is refused on a controller that falls
286
+ back to it. Editing a record there means `dns delete` followed by
287
+ `dns create`, which keeps the delete explicit and confirmed instead of hiding
288
+ it inside an update that cannot undo it when the create fails.
289
+
265
290
  ### Events
266
291
 
267
292
  ```bash