oxidized 0.34.3 → 0.36.0

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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/.coderabbit.yaml +21 -0
  3. data/.github/workflows/codeql.yml +4 -4
  4. data/.github/workflows/publishdocker.yml +88 -15
  5. data/.github/workflows/ruby.yml +2 -4
  6. data/.github/workflows/stale.yml +1 -1
  7. data/.rubocop.yml +14 -2
  8. data/.rubocop_todo.yml +21 -2
  9. data/CHANGELOG.md +86 -1
  10. data/Dockerfile +74 -66
  11. data/README.md +4 -5
  12. data/Rakefile +21 -3
  13. data/docs/Configuration.md +122 -1
  14. data/docs/Creating-Models.md +209 -28
  15. data/docs/Docker.md +2 -1
  16. data/docs/Inputs.md +29 -0
  17. data/docs/Model-Notes/APC.md +72 -0
  18. data/docs/Model-Notes/ExaLink.md +43 -0
  19. data/docs/Model-Notes/Fortinet.md +75 -0
  20. data/docs/Model-Notes/IvantiConnectSecure.md +59 -0
  21. data/docs/Model-Notes/TrueNAS.md +19 -0
  22. data/docs/ModelUnitTests.md +23 -0
  23. data/docs/Outputs.md +18 -4
  24. data/docs/Release.md +1 -1
  25. data/docs/Ruby-API.md +134 -1
  26. data/docs/Supported-OS-Types.md +22 -8
  27. data/docs/Troubleshooting.md +1 -1
  28. data/extra/device2yaml.rb +2 -3
  29. data/extra/hooks/modelrules.rb +55 -0
  30. data/extra/hooks/modelrulesadvanced.rb +168 -0
  31. data/extra/hooks/srcipmap.rb +54 -0
  32. data/extra/oxidized.runit +1 -1
  33. data/lib/oxidized/core.rb +2 -1
  34. data/lib/oxidized/hook/githubrepo.rb +2 -1
  35. data/lib/oxidized/hook.rb +56 -8
  36. data/lib/oxidized/input/exec.rb +0 -4
  37. data/lib/oxidized/input/ftp.rb +0 -13
  38. data/lib/oxidized/input/http.rb +47 -15
  39. data/lib/oxidized/input/input.rb +33 -13
  40. data/lib/oxidized/input/scp.rb +11 -65
  41. data/lib/oxidized/input/ssh.rb +12 -62
  42. data/lib/oxidized/input/sshbase.rb +107 -0
  43. data/lib/oxidized/input/telnet.rb +2 -6
  44. data/lib/oxidized/input/tftp.rb +7 -3
  45. data/lib/oxidized/model/adva.rb +1 -1
  46. data/lib/oxidized/model/airfiber.rb +1 -1
  47. data/lib/oxidized/model/aoscx.rb +32 -45
  48. data/lib/oxidized/model/aosw.rb +11 -12
  49. data/lib/oxidized/model/apc_aos.rb +4 -0
  50. data/lib/oxidized/model/apcaos.rb +39 -0
  51. data/lib/oxidized/model/arubainstant.rb +29 -26
  52. data/lib/oxidized/model/asa.rb +7 -7
  53. data/lib/oxidized/model/asternos.rb +1 -1
  54. data/lib/oxidized/model/axos.rb +1 -1
  55. data/lib/oxidized/model/comtrol.rb +1 -1
  56. data/lib/oxidized/model/comware.rb +3 -1
  57. data/lib/oxidized/model/cumulus.rb +2 -7
  58. data/lib/oxidized/model/defacto.rb +26 -0
  59. data/lib/oxidized/model/dslcommands.rb +93 -0
  60. data/lib/oxidized/model/dslsetup.rb +102 -0
  61. data/lib/oxidized/model/eatonnetwork.rb +5 -0
  62. data/lib/oxidized/model/efos.rb +5 -5
  63. data/lib/oxidized/model/eltex.rb +1 -1
  64. data/lib/oxidized/model/enterasys800.rb +1 -1
  65. data/lib/oxidized/model/exalink.rb +36 -0
  66. data/lib/oxidized/model/fabricos.rb +1 -1
  67. data/lib/oxidized/model/fastiron.rb +2 -2
  68. data/lib/oxidized/model/firelinuxos.rb +1 -3
  69. data/lib/oxidized/model/fortigate.rb +160 -0
  70. data/lib/oxidized/model/fortios.rb +28 -69
  71. data/lib/oxidized/model/fsos.rb +2 -4
  72. data/lib/oxidized/model/garderos.rb +1 -6
  73. data/lib/oxidized/model/h3c.rb +1 -1
  74. data/lib/oxidized/model/ios.rb +21 -15
  75. data/lib/oxidized/model/ironware.rb +6 -4
  76. data/lib/oxidized/model/ivanti.rb +54 -0
  77. data/lib/oxidized/model/macros.rb +60 -0
  78. data/lib/oxidized/model/mlnxos.rb +14 -17
  79. data/lib/oxidized/model/model.rb +89 -98
  80. data/lib/oxidized/model/ndms.rb +6 -0
  81. data/lib/oxidized/model/netgear.rb +6 -3
  82. data/lib/oxidized/model/netonix.rb +1 -1
  83. data/lib/oxidized/model/netscaler.rb +1 -1
  84. data/lib/oxidized/model/nxos.rb +9 -9
  85. data/lib/oxidized/model/onefinity.rb +1 -1
  86. data/lib/oxidized/model/opnsense.rb +8 -0
  87. data/lib/oxidized/model/outputs.rb +5 -0
  88. data/lib/oxidized/model/perle.rb +41 -0
  89. data/lib/oxidized/model/pfsense.rb +8 -0
  90. data/lib/oxidized/model/saos10.rb +1 -1
  91. data/lib/oxidized/model/siklu.rb +1 -1
  92. data/lib/oxidized/model/siklumhtg.rb +1 -1
  93. data/lib/oxidized/model/sixwind.rb +1 -1
  94. data/lib/oxidized/model/slxos.rb +1 -1
  95. data/lib/oxidized/model/smartbyte.rb +48 -0
  96. data/lib/oxidized/model/sonicos.rb +1 -1
  97. data/lib/oxidized/model/speedtouch.rb +1 -1
  98. data/lib/oxidized/model/telco.rb +1 -1
  99. data/lib/oxidized/model/tnsr.rb +7 -3
  100. data/lib/oxidized/model/trango.rb +1 -1
  101. data/lib/oxidized/model/truenas.rb +10 -1
  102. data/lib/oxidized/model/ucs.rb +1 -1
  103. data/lib/oxidized/model/voltaire.rb +1 -1
  104. data/lib/oxidized/model/voss.rb +3 -0
  105. data/lib/oxidized/model/vyatta.rb +1 -1
  106. data/lib/oxidized/model/vyos.rb +36 -0
  107. data/lib/oxidized/model/zhoneolt.rb +1 -1
  108. data/lib/oxidized/model/zynoscli.rb +1 -1
  109. data/lib/oxidized/node.rb +31 -24
  110. data/lib/oxidized/nodes.rb +2 -0
  111. data/lib/oxidized/output/file.rb +7 -1
  112. data/lib/oxidized/output/git.rb +11 -1
  113. data/lib/oxidized/output/gitcrypt.rb +1 -1
  114. data/lib/oxidized/output/http.rb +12 -3
  115. data/lib/oxidized/source/csv.rb +5 -0
  116. data/lib/oxidized/source/http.rb +10 -2
  117. data/lib/oxidized/source/jsonfile.rb +5 -0
  118. data/lib/oxidized/source/sql.rb +5 -0
  119. data/lib/oxidized/version.rb +2 -2
  120. data/lib/oxidized/worker.rb +36 -15
  121. data/lib/refinements.rb +18 -0
  122. data/oxidized.gemspec +28 -25
  123. metadata +98 -71
  124. data/docs/Model-Notes/APC_AOS.md +0 -65
  125. data/docs/Model-Notes/FortiOS.md +0 -44
  126. data/lib/oxidized/model/timos.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a87e3af9faae64551e102d6cdc54df2e45faabca7ba632ca08ef5d75d15de049
4
- data.tar.gz: 1b53f1e19450f791ec11cdd61fe228764374d16aa41c1fef2c246c63f1cbaa4e
3
+ metadata.gz: f594c7328a0f47ff8623d8a025df44224af1e7addc71c57bd0c37ab2285c4f8f
4
+ data.tar.gz: 837bb841353c080c93235ca4a46095d42335fa8e05623f3e6f7ef5fc9cc67a44
5
5
  SHA512:
6
- metadata.gz: 37b6c4f96885e86b5780ad61ce64e8f51292ddb2a33ab794cae270101f436cbaad3c684b7262b01197a61e93e8d45257dae2ecb3b080fb6befd9f93162778515
7
- data.tar.gz: 5b7739c4e7fa07904c94ad241d9a95c636d7774c517f1235db893192c0df938c8c91bd2d6efd161eaba7ea35cbbc7dd129a275d83f3d58386ca986126ef9adcf
6
+ metadata.gz: ce194d0b6353b929bdb14514d835a1500d846c50491d30782d89c1c3ccc2a6e0f0cdc34aa0b9385c8ca2ce82f0c759a917f252076fc8675169d5eb40694bc3dc
7
+ data.tar.gz: 21c716e53c0e391bfefa617e0a3bc68a23a14a04dce3d508ca82c127f993ea909a27799901d6ad3c3e0bb1625d749bae73882f2c8e2fcb8f0b400aca036df5ab
data/.coderabbit.yaml ADDED
@@ -0,0 +1,21 @@
1
+ reviews:
2
+ auto_review:
3
+ enabled: false
4
+ auto_incremental_review: false
5
+
6
+ commit_status: false
7
+ review_status: false
8
+ high_level_summary: false
9
+ suggested_labels: false
10
+ suggested_reviewers: false
11
+ changed_files_summary: false
12
+ poem: false
13
+ sequence_diagrams: false
14
+ estimate_code_review_effort: false
15
+ assess_linked_issues: false
16
+ related_issues: false
17
+ in_progress_fortune: false
18
+
19
+
20
+ chat:
21
+ auto_reply: false
@@ -40,11 +40,11 @@ jobs:
40
40
 
41
41
  steps:
42
42
  - name: Checkout repository
43
- uses: actions/checkout@v4
43
+ uses: actions/checkout@v6
44
44
 
45
45
  # Initializes the CodeQL tools for scanning.
46
46
  - name: Initialize CodeQL
47
- uses: github/codeql-action/init@v3
47
+ uses: github/codeql-action/init@v4
48
48
  with:
49
49
  languages: ${{ matrix.language }}
50
50
  # If you wish to specify custom queries, you can do so here or in a config file.
@@ -58,7 +58,7 @@ jobs:
58
58
  # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
59
59
  # If this step fails, then you should remove it and run the build manually (see below)
60
60
  - name: Autobuild
61
- uses: github/codeql-action/autobuild@v3
61
+ uses: github/codeql-action/autobuild@v4
62
62
 
63
63
  # ℹ️ Command-line programs to run using the OS shell.
64
64
  # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -71,6 +71,6 @@ jobs:
71
71
  # ./location_of_script_within_repo/buildscript.sh
72
72
 
73
73
  - name: Perform CodeQL Analysis
74
- uses: github/codeql-action/analyze@v3
74
+ uses: github/codeql-action/analyze@v4
75
75
  with:
76
76
  category: "/language:${{matrix.language}}"
@@ -3,42 +3,115 @@ on:
3
3
  push:
4
4
  branches: [ "master" ]
5
5
  tags: [ "[0-9]+.[0-9]+.[0-9]+" ]
6
+ env:
7
+ REGISTRY_IMAGE: oxidized/oxidized
6
8
 
7
9
  jobs:
8
10
  build:
9
11
  if: github.repository_owner == 'ytti'
10
- runs-on: ubuntu-latest
12
+ runs-on: ${{ matrix.runner }}
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ include:
17
+ - platform: linux/amd64
18
+ runner: ubuntu-latest
19
+ - platform: linux/arm64
20
+ runner: ubuntu-24.04-arm
21
+
11
22
  steps:
23
+ - name: Prepare
24
+ run: |
25
+ platform=${{ matrix.platform }}
26
+ echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
12
27
 
13
- - name: Define tags
28
+ - name: Docker meta
14
29
  id: meta
15
- uses: docker/metadata-action@v5
30
+ uses: docker/metadata-action@v6
16
31
  with:
17
- images: |
18
- oxidized/oxidized
32
+ images: ${{ env.REGISTRY_IMAGE }}
19
33
  tags: |
20
34
  type=semver,pattern={{version}}
35
+ type=semver,pattern={{major}}
21
36
  type=sha,prefix=master-
22
37
  flavor: |
23
38
  latest=true
24
39
 
25
40
  - name: Login to Docker Hub
26
- uses: docker/login-action@v3
41
+ uses: docker/login-action@v4
27
42
  with:
28
43
  username: ${{ secrets.DOCKER_USERNAME }}
29
44
  password: ${{ secrets.DOCKER_PASSWORD }}
30
45
 
31
- - name: Set up QEMU
32
- uses: docker/setup-qemu-action@v3
33
-
34
46
  - name: Set up Docker Buildx
35
- uses: docker/setup-buildx-action@v3
47
+ uses: docker/setup-buildx-action@v4
36
48
 
37
- - name: Build and push
38
- uses: docker/build-push-action@v6
49
+ - name: Build and push by digest
50
+ id: build
51
+ uses: docker/build-push-action@v7
39
52
  with:
40
- platforms: linux/amd64,linux/arm64
41
- push: true
42
- tags: ${{ steps.meta.outputs.tags }}
53
+ platforms: ${{ matrix.platform }}
54
+ tags: ${{ env.REGISTRY_IMAGE }}
55
+ labels: |
56
+ ${{ steps.meta.outputs.labels }}
57
+ org.opencontainers.image.ref.name=${{ steps.meta.outputs.version }}
43
58
  build-args: |
44
59
  BUILDKIT_CONTEXT_KEEP_GIT_DIR=true
60
+ outputs: type=image,push-by-digest=true,name-canonical=true,push=true
61
+
62
+ - name: Export digest
63
+ run: |
64
+ mkdir -p ${{ runner.temp }}/digests
65
+ digest="${{ steps.build.outputs.digest }}"
66
+ touch "${{ runner.temp }}/digests/${digest#sha256:}"
67
+
68
+ - name: Upload digest
69
+ uses: actions/upload-artifact@v7
70
+ with:
71
+ name: digests-${{ env.PLATFORM_PAIR }}
72
+ path: ${{ runner.temp }}/digests/*
73
+ if-no-files-found: error
74
+ retention-days: 1
75
+
76
+ merge:
77
+ runs-on: ubuntu-latest
78
+ needs:
79
+ - build
80
+ steps:
81
+ - name: Download digests
82
+ uses: actions/download-artifact@v8
83
+ with:
84
+ path: ${{ runner.temp }}/digests
85
+ pattern: digests-*
86
+ merge-multiple: true
87
+
88
+ - name: Login to Docker Hub
89
+ uses: docker/login-action@v4
90
+ with:
91
+ username: ${{ secrets.DOCKER_USERNAME }}
92
+ password: ${{ secrets.DOCKER_PASSWORD }}
93
+
94
+ - name: Set up Docker Buildx
95
+ uses: docker/setup-buildx-action@v4
96
+
97
+ - name: Docker meta
98
+ id: meta
99
+ uses: docker/metadata-action@v6
100
+ with:
101
+ images: ${{ env.REGISTRY_IMAGE }}
102
+ tags: |
103
+ type=semver,pattern={{version}}
104
+ type=semver,pattern={{major}}
105
+ type=sha,prefix=master-
106
+ flavor: |
107
+ latest=true
108
+
109
+ - name: Create manifest list and push
110
+ working-directory: ${{ runner.temp }}/digests
111
+ run: |
112
+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
113
+ $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
114
+
115
+ - name: Inspect image
116
+ run: |
117
+ docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
@@ -19,14 +19,12 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  strategy:
21
21
  matrix:
22
- ruby-version: ['3.1', '3.2', '3.3', '3.4', 'ruby-head']
22
+ ruby-version: ['3.0', '3.1', '3.2', '3.3', '3.4', 'ruby-head']
23
23
  continue-on-error: ${{ matrix.ruby-version == 'ruby-head' }}
24
24
 
25
25
  steps:
26
- - uses: actions/checkout@v4
26
+ - uses: actions/checkout@v6
27
27
  - name: Set up Ruby
28
- # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
29
- # change this to (see https://github.com/ruby/setup-ruby#versioning):
30
28
  uses: ruby/setup-ruby@v1
31
29
  with:
32
30
  ruby-version: ${{ matrix.ruby-version }}
@@ -12,7 +12,7 @@ jobs:
12
12
  stale:
13
13
  runs-on: ubuntu-latest
14
14
  steps:
15
- - uses: actions/stale@v9
15
+ - uses: actions/stale@v10
16
16
  with:
17
17
  stale-issue-message: 'This issue is stale because it has been open 90 days with no activity.'
18
18
  stale-pr-message: 'This PR is stale because it has been open 90 days with no activity.'
data/.rubocop.yml CHANGED
@@ -1,5 +1,9 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
 
3
+ inherit_mode:
4
+ merge:
5
+ - Exclude
6
+
3
7
  plugins:
4
8
  - rubocop-rake
5
9
  - rubocop-minitest
@@ -24,7 +28,6 @@ Style/FrozenStringLiteralComment:
24
28
 
25
29
  Layout/LineLength:
26
30
  Enabled: true
27
- IgnoreCopDirectives: false
28
31
  Max: 120
29
32
  # Too much models have long lines, which is unsafe to reduce without
30
33
  # having an existing model unit test.
@@ -66,8 +69,13 @@ Style/ConditionalAssignment:
66
69
  Style/FormatString:
67
70
  EnforcedStyle: percent
68
71
 
72
+ Style/FileOpen:
73
+ Exclude:
74
+ - lib/oxidized/input/*.rb
75
+
69
76
  Style/FormatStringToken:
70
77
  EnforcedStyle: unannotated
78
+ AllowedMethods: ['metadata']
71
79
 
72
80
  Style/HashEachMethods:
73
81
  Enabled: true
@@ -81,6 +89,10 @@ Style/HashTransformKeys:
81
89
  Style/HashTransformValues:
82
90
  Enabled: true
83
91
 
92
+ Style/OneClassPerFile:
93
+ Exclude:
94
+ - spec/**/*.rb
95
+
84
96
  Style/RegexpLiteral:
85
97
  EnforcedStyle: slashes
86
98
  AllowInnerSlashes: true
@@ -106,7 +118,7 @@ Metrics/AbcSize:
106
118
  Enabled: false
107
119
 
108
120
  Metrics/ClassLength:
109
- Enabled: false
121
+ Max: 200
110
122
 
111
123
  Metrics/PerceivedComplexity:
112
124
  Enabled: false
data/.rubocop_todo.yml CHANGED
@@ -1,11 +1,18 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2025-08-01 14:00:10 UTC using RuboCop version 1.79.1.
3
+ # on 2026-03-31 11:49:52 UTC using RuboCop version 1.86.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
+ # Offense count: 2
10
+ # Configuration parameters: CountComments, Max, CountAsOne.
11
+ Metrics/ClassLength:
12
+ Exclude:
13
+ - 'lib/oxidized/node.rb'
14
+ - 'lib/oxidized/output/git.rb'
15
+
9
16
  # Offense count: 1
10
17
  Style/ClassVars:
11
18
  Exclude:
@@ -19,7 +26,19 @@ Style/DoubleNegation:
19
26
  Exclude:
20
27
  - 'lib/oxidized/hook/exec.rb'
21
28
 
22
- # Offense count: 33
29
+ # Offense count: 1
30
+ Style/FileOpen:
31
+ Exclude:
32
+ - 'extra/syslog.rb'
33
+
34
+ # Offense count: 2
35
+ # Configuration parameters: AllowedClasses.
36
+ Style/OneClassPerFile:
37
+ Exclude:
38
+ - 'lib/oxidized/input/telnet.rb'
39
+ - 'lib/oxidized/signals.rb'
40
+
41
+ # Offense count: 32
23
42
  # This cop supports unsafe autocorrection (--autocorrect-all).
24
43
  Style/SlicingWithRange:
25
44
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -4,13 +4,98 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## [0.36.0 - 2026-03-31]
8
+ ### Release Notes
9
+ The fortios model has been split into fortigate and fortios. You need the new fortigate model for FortiGate firewalls. Be sure to check the [Fortinet model notes](docs/Model-Notes/Fortinet.md) before upgrading.
10
+
11
+ The SCP gem is now an optional dependency as it will rarely be used - you must install it if you need it. It is still included in the docker image.
12
+
13
+ We may rework models in the future to clean up duplicated code (by using the macros or by inheriting from the Defacto model). To make sure your favorite model doesn’t break, please share [simulation files](/docs/DeviceSimulation.md) via issues or, preferably, pull requests, so we can detect when a change breaks a model.
14
+
15
+ ### Added
16
+ - Support https mode, headers, and ssl verify for HTTP output (@bahirul)
17
+ - String refinements: introduce `keep_lines` and `reject_lines` methods (@robertcheramy)
18
+ - Support for storing configurations only on significant changes (@robertcheramy)
19
+ - Add support for Ivanti Secure Connect ISA models (@candleflip)
20
+ - smartbyte: new model for SmartByte switches (@freddy36)
21
+ - Support multiple input (@robertcheramy)
22
+ - apcaos model with SSH + SCP capabilities, deprecates apc_aos (@robertcheramy)
23
+ - exalink model for specific Cisco ExaLink Fusion (formerly Exablaze) switches (@obol89)
24
+ - source_node_transform hook, allows user to manipulate node data when loading from source (@ytti)
25
+ - docker image: publish major version tag (e.g. `0`) in addition to full semver tag on releases (@infabo)
26
+ - introduce the defacto model and macros for models (@ytti)
27
+
28
+ ### Changed
29
+ - Refactored models: Use `keep_lines` and `reject_lines` in aosw, arubainstant, asa, efos, firelinuxos, fsos, ironware, mlnxos and perle (@robertcheramy)
30
+ - Refactor SSH and SCP into a common class SSHBase. Fixes #3597 (@robertcheramy)
31
+ - Modified models to support store mode on significant changes: ios, fortios, perle, ndms (@robertcheramy, @furriest)
32
+ - fortios: model rewrite and split into fortios and fortigate. Fixes #3680 (@robertcheramy)
33
+ - fortigate: Add PSU & SFP inventory (@robertcheramy)
34
+ - fortigate: move var fortios_autoupdate (deprecated) to fortigate_autoupdate (@robertcheramy)
35
+ - netgear: extended login and pager detection to add support for GS728TPv2 and GS752TPv2 (@weberc)
36
+ - comware: Hide snmp secrets for Comware (@iriseden)
37
+ - Aruba-CX : Hide secrets for Aruba-CX (@iriseden)
38
+
39
+ ### Fixed
40
+ - VyOS: Only remove SNMP community, not route-maps. Fixes #3735 (@systeembeheerder)
41
+ - apc_aos: set comment to "; " to match comments in config.ini (@robertcheramy)
42
+ - h3c: fix overly permissive prompt regexp causing false matches. Fixes #3673 (@robertcheramy)
43
+ - extra/device2yaml.rb: fix \r being removed at end of line (@robertcheramy)
44
+ - perle: remove trailing \r (the device sends \r\r\n) (@robertcheramy)
45
+ - Reintroduce support for Ruby 3.0. Fixes #3688 (@robertcheramy)
46
+ - githubrepo: fix authentication with ssh-agent not working. Fixes #3420 (@robertcheramy)
47
+ - fastiron: adjust prompt to account for stacks, remove time from stack output. Fixes #3106 (@ManoftheSea)
48
+ - interval: fix fetching device configuration at oxidized start when interval is 0. Fixes #3746 (@tgr229)
49
+ - voss: more cleanup of constantly changing values (fan & temp) for at least Extreme Networks 7520-48Y-8C-FabricEngine (8.10.5.0) (@irrwitzer42)
50
+ - truenas: Added retry logic to use sudo for reading/dumping the configuration database if needed. Fixes #3767 (@neilschelly)
51
+ - aoscx: update regex to include 'N/A' in FAN speed parsing (@solrac200, @robertcheramy)
52
+ - nxos: show inventory for older models. Fixes #3779 (@scamp)
53
+
54
+ ## [0.35.0 - 2025-12-04]
55
+ ### Release Notes
56
+ - VyOS now has it's own model and should be used for supported VyOS versions instead of the Vyatta model.
57
+ - AosCX has been reworked and may break old OS versions. Submit an issue along with a YAML Simulation File if you encounter problems.
58
+ - TiMOS (deprecated model) has been removed. Use SROS.
59
+ - FortiOs will be reworked in release 0.36 (Issue #3680). Subscribe to the issue if you want to be informed and test the model before the release.
60
+ - ~~Support for Ruby 3.1 will be discontinued in release 0.36 (Issue #3688) if no one objects.~~
61
+
62
+ ### Added
63
+ - Allow setting timeout on per node basis. Closes #3612 (@ytti)
64
+ - Added Vyos as individual model. Closes #3603 #3560 (@nicolasberens)
65
+ - Add metadata to models. Closes #3249 (@robertcheramy)
66
+ - perle: new model for console servers (@robertcheramy)
67
+ - Introduce [conditional commands](/docs/Ruby-API.md#conditional-commands) (@robertcheramy)
68
+
69
+ ### Changed
70
+ - tnsr: added simulation data for older versions (@Vantomas)
71
+ - docker image: change default shell to bash. (@electrocret)
72
+ - refactor suppression of ANSI escape codes into model.rb (use `clean :escape_codes` in your model. Updated cumulus, garderos, mlnxos and vyos. (@robertcheramy)
73
+ - aoscx: rework handling of ANSI escape codes (@robertcheramy)
74
+ - docker: build on arm64 natively. Closes #3665 (@robertcheramy)
75
+ - docker image: move base image from phusion/baseimage to debian:trixie-slim (@robertcheramy)
76
+
77
+ ### Fixed
78
+ - input/http: bracket IPv6 URI. Fixes #3620 (@ytti)
79
+ - tnsr: fixed prompt regex, sometimes --More-- pager is misplaced on older versions (@ClumsyAdmin)
80
+ - eatonnetwork: Update for firmware v2.2.0 #3634 (@thanegill)
81
+ - input/http: Corrected pagination causing duplicated nodes. Fixes #3676 (@kquilliam)
82
+ - many models: fix redundant regular expressions (@robertcheramy)
83
+ - timos: remove deprecated model timos. Use sros. #3617 (@robertcheramy)
84
+ - fsos: set terminal width to 0. Fixes #3576 (@robertcheramy)
85
+ - aoscx: rework environmental data anonymization. Fixes #3568 (@robertcheramy, inspired by PR #3653 by @martadams89)
86
+ - netgear: fix prompt issues caused by ANSI escape codes. Fixes #3287 (@robertcheramy)
87
+ - remove redundant dependency on bundler producing a CI failure on ruby-head (@robertcheramy)
88
+ - nxos: use "show inventory" when "show inventory all" is not supported. Fixes #3657 (@robertcheramy)
89
+ - arubainstant: handle spaces/parentheses in AP names and add Zone column. Fixes #3611 (@iRomanyshyn, @robertcheramy)
90
+ - core: fix "undefined method `[]' for nil" when only extensions: configured. Fixes: #3607 (@robertcheramy)
91
+
92
+
7
93
  ## [0.34.3 - 2025-08-05]
8
94
  This release fixes an issue preventing /node/show/<hostname> to work in oxidized-web.
9
95
 
10
96
  ### Fixed
11
97
  - Guarantee that node vars is a dict (Issue ytti/oxidized-web#365) (@ytti)
12
98
 
13
-
14
99
  ## [0.34.2 – 2025-08-01]
15
100
  This release mainly fixes a bug in input/scp that made ssh raise an error when
16
101
  closing a closed connection (Issue #3583).
data/Dockerfile CHANGED
@@ -1,94 +1,102 @@
1
- FROM docker.io/phusion/baseimage:noble-1.0.2
2
-
3
- ENV DEBIAN_FRONTEND=noninteractive
1
+ FROM docker.io/debian:trixie-slim
4
2
 
5
3
  ##### Place "static" commands at the beginning to optimize image size and build speed
6
- # remove default ubuntu user
7
- RUN userdel -r ubuntu
8
4
 
9
5
  # add non-privileged user
10
- ARG UID=30000
11
- ARG GID=$UID
12
- RUN groupadd -g "${GID}" -r oxidized && useradd -u "${UID}" -r -m -d /home/oxidized -g oxidized oxidized
6
+ RUN groupadd -g "30000" -r oxidized && \
7
+ useradd -u "30000" -r -m -d /home/oxidized -g oxidized oxidized && \
8
+ chsh -s /bin/bash oxidized
13
9
 
10
+ # See PR #3637 - ruby runs /bin/sh and bash is whished for exec hooks
11
+ RUN ln -sf /bin/bash /bin/sh
14
12
 
15
13
  ##### MSMTP - Sending emails
16
14
  # link config for msmtp for easier use.
17
15
  # /home/oxidized/.msmtprc is a symbolic link to /home/oxidized/.config/oxidized/.msmtprc
18
16
  # Create the files as the user oxidized
19
17
  RUN mkdir -p /home/oxidized/.config/oxidized/ && \
20
- chmod -R ug=rwX,o= /home/oxidized/.config/ && \
21
18
  touch /home/oxidized/.config/oxidized/.msmtprc && \
22
- chmod -R u=rw,go= /home/oxidized/.config/oxidized/.msmtprc && \
23
19
  ln -s /home/oxidized/.config/oxidized/.msmtprc /home/oxidized/ && \
24
- chown -R oxidized:oxidized /home/oxidized/.config /home/oxidized/.msmtprc
20
+ chmod -R ug=rwX,o= /home/oxidized/.config/ && \
21
+ chown -R oxidized:oxidized /home/oxidized/
25
22
 
26
23
  # add runit services
27
24
  COPY extra/oxidized.runit /etc/service/oxidized/run
28
25
  COPY extra/auto-reload-config.runit /etc/service/auto-reload-config/run
29
26
  COPY extra/update-ca-certificates.runit /etc/service/update-ca-certificates/run
30
27
 
31
- # set up dependencies for the build process
32
- RUN apt-get -qy update \
33
- && apt-get -qy upgrade \
34
- && apt-get -qy --no-install-recommends install ruby \
35
- # Build process of oxidized from git and git-tools in the container
36
- git \
37
- # Allow git send-email from docker image
38
- git-email libmailtools-perl \
39
- # Allow sending emails in the docker container
40
- msmtp \
41
- # Debuging tools inside the container
42
- inetutils-telnet \
43
- # Use ubuntu gems where possible
44
- # Gems needed by oxidized
45
- ruby-rugged ruby-slop ruby-psych \
46
- ruby-net-telnet ruby-net-ssh ruby-net-ftp ruby-ed25519 \
47
- # Gem dependencies for inputs
48
- ruby-net-http-persistent ruby-mechanize \
49
- # Gem dependencies for sources
50
- ruby-sqlite3 ruby-mysql2 ruby-pg ruby-sequel ruby-gpgme\
51
- # Gem dependencies for hooks
52
- ruby-aws-sdk ruby-xmpp4r \
53
- # Gems needed by oxidized-web
54
- ruby-charlock-holmes ruby-haml ruby-htmlentities ruby-json \
55
- puma ruby-sinatra ruby-sinatra-contrib \
56
- && apt-get clean \
57
- && rm -rf /var/lib/apt/lists/*
58
-
59
- # gems not available in ubuntu noble
60
- RUN gem install --no-document \
61
- # dependencies for hooks
62
- slack-ruby-client cisco_spark \
63
- # dependencies for specific inputs
64
- net-tftp \
65
- # Net scp is needed in Version >= 4.1.0, which is not available in ubuntu
66
- net-scp
67
-
68
- # Prepare the build of oxidized, copy our workig directory in the container
28
+ # Prepare the build of oxidized, copy our working directory in the container
69
29
  COPY . /tmp/oxidized/
70
30
  WORKDIR /tmp/oxidized
71
31
 
72
- # Install gems which needs a build environment
73
- RUN apt-get -qy update && \
74
- apt-get -qy install --no-install-recommends \
75
- build-essential ruby-dev && \
76
- ##### X25519 (a.k.a. Curve25519) Elliptic Curve Diffie-Hellman
77
- gem install x25519 && \
78
- ##### build & install oxidized from the working repository
32
+ # set up dependencies for the build process
33
+ RUN set -eux; \
34
+ export DEBIAN_FRONTEND=noninteractive; \
35
+ apt-get update; \
36
+ # no apt-get upgrade needed, as debian images are rebuilt on security issues
37
+ apt-get install -y --no-install-recommends \
38
+ # runit: lightweight service supervisor
39
+ # dumb-init: proper PID 1 signal handling
40
+ # gosu: run oxidized as the user oxidized
41
+ runit dumb-init gosu \
42
+ # Build tools
43
+ build-essential ruby-dev \
44
+ # Useful tools
45
+ openssh-client vim-tiny inetutils-telnet \
46
+ # Dependencies for /extra scripts
47
+ curl jq \
48
+ # Build process of oxidized from git and git-tools in the container
49
+ git \
50
+ # Allow git send-email from docker image
51
+ git-email libmailtools-perl \
52
+ # Allow sending emails in the docker container
53
+ msmtp \
54
+ # Use debian packaged gems where possible
55
+ # ruby and core gems needed by oxidized
56
+ ruby ruby-rugged ruby-slop \
57
+ # Gem dependencies for inputs
58
+ ruby-net-telnet ruby-net-ssh ruby-net-ftp ruby-ed25519 ruby-net-scp \
59
+ ruby-net-http-persistent ruby-mechanize \
60
+ # Gem dependencies for sources
61
+ ruby-sqlite3 ruby-mysql2 ruby-pg ruby-sequel ruby-gpgme\
62
+ # Gem dependencies for hooks
63
+ ruby-aws-sdk ruby-xmpp4r \
64
+ # Gems needed by oxidized-web
65
+ ruby-charlock-holmes ruby-haml ruby-htmlentities ruby-json \
66
+ puma ruby-sinatra ruby-sinatra-contrib \
67
+ # Gems needed by slack-ruby-client
68
+ ruby-faraday ruby-faraday-net-http ruby-faraday-multipart ruby-hashie \
69
+ # Gems needed by semantic logger
70
+ ruby-concurrent \
71
+ ; \
72
+ # build & install oxidized from the working repository
79
73
  # docker automated build gets shallow copy, but non-shallow copy cannot be unshallowed
80
- git fetch --unshallow || true && \
81
- rake install && \
82
- # install oxidized-web
83
- gem install oxidized-web --no-document && \
74
+ git fetch --unshallow || true; \
75
+ rake install; \
76
+ # install oxidized-web and gems not available in debian trixie
77
+ gem install --no-document --no-wrappers --conservative --minimal-deps \
78
+ oxidized-web \
79
+ # dependencies for hooks
80
+ slack-ruby-client cisco_spark \
81
+ # dependencies for specific inputs
82
+ net-tftp \
83
+ ##### X25519 (a.k.a. Curve25519) Elliptic Curve Diffie-Hellman
84
+ x25519 \
85
+ ; \
84
86
  # remove the packages we do not need.
85
- apt-get -qy remove build-essential ruby-dev && \
86
- apt-get -qy autoremove && \
87
- apt-get clean && \
88
- rm -rf /var/lib/apt/lists/*
87
+ apt-get remove -y build-essential ruby-dev; \
88
+ apt-get autoremove -y ; \
89
+ apt-get clean; \
90
+ rm -rf /var/lib/apt/lists/*; \
91
+ find /var/lib/gems/*/cache -mindepth 1 -delete; \
92
+ rm -rf /tmp/oxidized;
89
93
 
90
- # clean up
91
94
  WORKDIR /
92
- RUN rm -rf /tmp/oxidized
93
95
 
94
96
  EXPOSE 8888/tcp
97
+
98
+ # dumb-init handles PID 1 for proper signal forwarding (Ctrl-C, SIGTERM)
99
+ ENTRYPOINT ["/usr/bin/dumb-init", "--"]
100
+
101
+ # runit supervises all services in /etc/service/
102
+ CMD ["runsvdir", "-P", "/etc/service"]
data/README.md CHANGED
@@ -73,8 +73,7 @@ Check out the [Oxidized TREX 2014 presentation](http://youtu.be/kBQ_CTUuqeU?t=3h
73
73
  ## Installation
74
74
 
75
75
  ### Debian and Ubuntu
76
-
77
- Debian "buster" or newer and Ubuntu 17.10 (artful) or newer are recommended. On Ubuntu, begin by enabling the `universe`
76
+ Debian 12 "bookworm" or newer and Ubuntu 22.04 (Jammy Jellyfish) or newer are recommended. On Ubuntu, begin by enabling the `universe`
78
77
  repository (required for libssh2-1-dev):
79
78
 
80
79
  ```shell
@@ -84,7 +83,7 @@ add-apt-repository universe
84
83
  Install the dependencies:
85
84
 
86
85
  ```shell
87
- apt install ruby ruby-dev libsqlite3-dev libssl-dev pkg-config cmake libssh2-1-dev libicu-dev zlib1g-dev g++ libyaml-dev
86
+ apt install ruby ruby-dev libsqlite3-dev libssl-dev pkg-config cmake libssh2-1-dev libicu-dev zlib1g-dev g++ libyaml-dev libzstd-dev
88
87
  ```
89
88
 
90
89
  Finally, install Oxidized:
@@ -101,7 +100,7 @@ gem install oxidized-script # Script-based input/output extensions
101
100
  ```
102
101
 
103
102
  ### Rocky Linux, Red Hat Enterprise Linux
104
- These instructions has been verified on Rocky Linux 9.3 and Fedora.
103
+ These instructions has been verified on Rocky Linux 9, Rocky Linux 10 and Fedora.
105
104
 
106
105
  On Rocky Linux 9, you need to install/enable EPEL, CRB and Ruby 3.1:
107
106
  ```shell
@@ -129,7 +128,7 @@ gem install oxidized-script # Script-based input/output extensions
129
128
  ```
130
129
 
131
130
  ### FreeBSD
132
- These installation instructions have been tested on FreeBSD 14.2, but
131
+ > :warning: These installation instructions have been tested on FreeBSD 14.2, but
133
132
  oxidized itself has not been tested on it.
134
133
 
135
134
  First install ruby and rubyXX-gems (Find out the name of the package with `pkg search gems`):
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rake/testtask'
3
+ require 'time'
3
4
  require_relative 'lib/oxidized/version'
4
5
 
5
6
  gemspec = Gem::Specification.load(Dir['*.gemspec'].first)
@@ -92,17 +93,34 @@ desc 'Build the container image with docker or podman'
92
93
  task :build_container do
93
94
  branch_name = %x(git rev-parse --abbrev-ref HEAD).chop.gsub '/', '_'
94
95
  sha_hash = %x(git rev-parse --short HEAD).chop
96
+ sha_hash_long = %x(git rev-parse HEAD).chop
95
97
  image_tag = "#{branch_name}-#{sha_hash}"
98
+ created_time = Time.now.iso8601
99
+
100
+ # Build-Args for consistent labels
101
+ build_args = [
102
+ "--label org.opencontainers.image.title=oxidized",
103
+ "--label org.opencontainers.image.description='Local build of Oxidized'",
104
+ "--label org.opencontainers.image.url=https://github.com/ytti/oxidized",
105
+ "--label org.opencontainers.image.source=https://github.com/ytti/oxidized",
106
+ "--label org.opencontainers.image.created=#{created_time}",
107
+ "--label org.opencontainers.image.ref.name=#{image_tag}",
108
+ "--label org.opencontainers.image.licenses=Apache-2.0",
109
+ "--label org.opencontainers.image.version=#{image_tag}",
110
+ "--label org.opencontainers.image.revision=#{sha_hash_long}",
111
+ "-t oxidized:#{image_tag}",
112
+ "-t oxidized:latest"
113
+ ].join(' ')
96
114
 
97
115
  # Prefer podman if available as it runs rootless
98
116
  if command_available?('podman')
99
- sh "podman build -t oxidized:#{image_tag} -t oxidized:latest ."
117
+ sh "podman build #{build_args} ."
100
118
  elsif command_available?('docker')
101
119
  if docker_needs_root?
102
120
  puts 'docker needs root to build the image. Using sudo...'
103
- sh "sudo docker build -t oxidized:#{image_tag} -t oxidized:latest ."
121
+ sh "sudo docker build #{build_args} ."
104
122
  else
105
- sh "docker build -t oxidized:#{image_tag} -t oxidized:latest ."
123
+ sh "docker build #{build_args} ."
106
124
  end
107
125
  else
108
126
  puts 'You need Podman or Docker to build the container image.'