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.
- checksums.yaml +4 -4
- data/.coderabbit.yaml +21 -0
- data/.github/workflows/codeql.yml +4 -4
- data/.github/workflows/publishdocker.yml +88 -15
- data/.github/workflows/ruby.yml +2 -4
- data/.github/workflows/stale.yml +1 -1
- data/.rubocop.yml +14 -2
- data/.rubocop_todo.yml +21 -2
- data/CHANGELOG.md +86 -1
- data/Dockerfile +74 -66
- data/README.md +4 -5
- data/Rakefile +21 -3
- data/docs/Configuration.md +122 -1
- data/docs/Creating-Models.md +209 -28
- data/docs/Docker.md +2 -1
- data/docs/Inputs.md +29 -0
- data/docs/Model-Notes/APC.md +72 -0
- data/docs/Model-Notes/ExaLink.md +43 -0
- data/docs/Model-Notes/Fortinet.md +75 -0
- data/docs/Model-Notes/IvantiConnectSecure.md +59 -0
- data/docs/Model-Notes/TrueNAS.md +19 -0
- data/docs/ModelUnitTests.md +23 -0
- data/docs/Outputs.md +18 -4
- data/docs/Release.md +1 -1
- data/docs/Ruby-API.md +134 -1
- data/docs/Supported-OS-Types.md +22 -8
- data/docs/Troubleshooting.md +1 -1
- data/extra/device2yaml.rb +2 -3
- data/extra/hooks/modelrules.rb +55 -0
- data/extra/hooks/modelrulesadvanced.rb +168 -0
- data/extra/hooks/srcipmap.rb +54 -0
- data/extra/oxidized.runit +1 -1
- data/lib/oxidized/core.rb +2 -1
- data/lib/oxidized/hook/githubrepo.rb +2 -1
- data/lib/oxidized/hook.rb +56 -8
- data/lib/oxidized/input/exec.rb +0 -4
- data/lib/oxidized/input/ftp.rb +0 -13
- data/lib/oxidized/input/http.rb +47 -15
- data/lib/oxidized/input/input.rb +33 -13
- data/lib/oxidized/input/scp.rb +11 -65
- data/lib/oxidized/input/ssh.rb +12 -62
- data/lib/oxidized/input/sshbase.rb +107 -0
- data/lib/oxidized/input/telnet.rb +2 -6
- data/lib/oxidized/input/tftp.rb +7 -3
- data/lib/oxidized/model/adva.rb +1 -1
- data/lib/oxidized/model/airfiber.rb +1 -1
- data/lib/oxidized/model/aoscx.rb +32 -45
- data/lib/oxidized/model/aosw.rb +11 -12
- data/lib/oxidized/model/apc_aos.rb +4 -0
- data/lib/oxidized/model/apcaos.rb +39 -0
- data/lib/oxidized/model/arubainstant.rb +29 -26
- data/lib/oxidized/model/asa.rb +7 -7
- data/lib/oxidized/model/asternos.rb +1 -1
- data/lib/oxidized/model/axos.rb +1 -1
- data/lib/oxidized/model/comtrol.rb +1 -1
- data/lib/oxidized/model/comware.rb +3 -1
- data/lib/oxidized/model/cumulus.rb +2 -7
- data/lib/oxidized/model/defacto.rb +26 -0
- data/lib/oxidized/model/dslcommands.rb +93 -0
- data/lib/oxidized/model/dslsetup.rb +102 -0
- data/lib/oxidized/model/eatonnetwork.rb +5 -0
- data/lib/oxidized/model/efos.rb +5 -5
- data/lib/oxidized/model/eltex.rb +1 -1
- data/lib/oxidized/model/enterasys800.rb +1 -1
- data/lib/oxidized/model/exalink.rb +36 -0
- data/lib/oxidized/model/fabricos.rb +1 -1
- data/lib/oxidized/model/fastiron.rb +2 -2
- data/lib/oxidized/model/firelinuxos.rb +1 -3
- data/lib/oxidized/model/fortigate.rb +160 -0
- data/lib/oxidized/model/fortios.rb +28 -69
- data/lib/oxidized/model/fsos.rb +2 -4
- data/lib/oxidized/model/garderos.rb +1 -6
- data/lib/oxidized/model/h3c.rb +1 -1
- data/lib/oxidized/model/ios.rb +21 -15
- data/lib/oxidized/model/ironware.rb +6 -4
- data/lib/oxidized/model/ivanti.rb +54 -0
- data/lib/oxidized/model/macros.rb +60 -0
- data/lib/oxidized/model/mlnxos.rb +14 -17
- data/lib/oxidized/model/model.rb +89 -98
- data/lib/oxidized/model/ndms.rb +6 -0
- data/lib/oxidized/model/netgear.rb +6 -3
- data/lib/oxidized/model/netonix.rb +1 -1
- data/lib/oxidized/model/netscaler.rb +1 -1
- data/lib/oxidized/model/nxos.rb +9 -9
- data/lib/oxidized/model/onefinity.rb +1 -1
- data/lib/oxidized/model/opnsense.rb +8 -0
- data/lib/oxidized/model/outputs.rb +5 -0
- data/lib/oxidized/model/perle.rb +41 -0
- data/lib/oxidized/model/pfsense.rb +8 -0
- data/lib/oxidized/model/saos10.rb +1 -1
- data/lib/oxidized/model/siklu.rb +1 -1
- data/lib/oxidized/model/siklumhtg.rb +1 -1
- data/lib/oxidized/model/sixwind.rb +1 -1
- data/lib/oxidized/model/slxos.rb +1 -1
- data/lib/oxidized/model/smartbyte.rb +48 -0
- data/lib/oxidized/model/sonicos.rb +1 -1
- data/lib/oxidized/model/speedtouch.rb +1 -1
- data/lib/oxidized/model/telco.rb +1 -1
- data/lib/oxidized/model/tnsr.rb +7 -3
- data/lib/oxidized/model/trango.rb +1 -1
- data/lib/oxidized/model/truenas.rb +10 -1
- data/lib/oxidized/model/ucs.rb +1 -1
- data/lib/oxidized/model/voltaire.rb +1 -1
- data/lib/oxidized/model/voss.rb +3 -0
- data/lib/oxidized/model/vyatta.rb +1 -1
- data/lib/oxidized/model/vyos.rb +36 -0
- data/lib/oxidized/model/zhoneolt.rb +1 -1
- data/lib/oxidized/model/zynoscli.rb +1 -1
- data/lib/oxidized/node.rb +31 -24
- data/lib/oxidized/nodes.rb +2 -0
- data/lib/oxidized/output/file.rb +7 -1
- data/lib/oxidized/output/git.rb +11 -1
- data/lib/oxidized/output/gitcrypt.rb +1 -1
- data/lib/oxidized/output/http.rb +12 -3
- data/lib/oxidized/source/csv.rb +5 -0
- data/lib/oxidized/source/http.rb +10 -2
- data/lib/oxidized/source/jsonfile.rb +5 -0
- data/lib/oxidized/source/sql.rb +5 -0
- data/lib/oxidized/version.rb +2 -2
- data/lib/oxidized/worker.rb +36 -15
- data/lib/refinements.rb +18 -0
- data/oxidized.gemspec +28 -25
- metadata +98 -71
- data/docs/Model-Notes/APC_AOS.md +0 -65
- data/docs/Model-Notes/FortiOS.md +0 -44
- data/lib/oxidized/model/timos.rb +0 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f594c7328a0f47ff8623d8a025df44224af1e7addc71c57bd0c37ab2285c4f8f
|
|
4
|
+
data.tar.gz: 837bb841353c080c93235ca4a46095d42335fa8e05623f3e6f7ef5fc9cc67a44
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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:
|
|
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:
|
|
28
|
+
- name: Docker meta
|
|
14
29
|
id: meta
|
|
15
|
-
uses: docker/metadata-action@
|
|
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@
|
|
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@
|
|
47
|
+
uses: docker/setup-buildx-action@v4
|
|
36
48
|
|
|
37
|
-
- name: Build and push
|
|
38
|
-
|
|
49
|
+
- name: Build and push by digest
|
|
50
|
+
id: build
|
|
51
|
+
uses: docker/build-push-action@v7
|
|
39
52
|
with:
|
|
40
|
-
platforms:
|
|
41
|
-
|
|
42
|
-
|
|
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 }}
|
data/.github/workflows/ruby.yml
CHANGED
|
@@ -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@
|
|
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 }}
|
data/.github/workflows/stale.yml
CHANGED
|
@@ -12,7 +12,7 @@ jobs:
|
|
|
12
12
|
stale:
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
14
|
steps:
|
|
15
|
-
- uses: actions/stale@
|
|
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
|
-
|
|
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
|
|
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:
|
|
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/
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
73
|
-
RUN
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
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 -
|
|
86
|
-
apt-get -
|
|
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
|
|
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
|
|
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
|
|
121
|
+
sh "sudo docker build #{build_args} ."
|
|
104
122
|
else
|
|
105
|
-
sh "docker build
|
|
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.'
|