From f4fe09947aed011d637bfa6976dfde3133339d33 Mon Sep 17 00:00:00 2001 From: "centreon-opentofu[bot]" <259862333+centreon-opentofu[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 14:20:45 +0000 Subject: [PATCH 1/9] chore: update CODEOWNERS --- .github/CODEOWNERS | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 45de92d8..8822a123 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,7 +11,12 @@ selinux/** @centreon/owners-pipelines .yamlfix.toml @centreon/owners-pipelines # Security Codeowners rules -.gitleaks.toml @centreon/owners-security -.gitleaksignore @centreon/owners-security -.githooks/pre-commit @centreon/owners-security -**/secu-*.yml @centreon/owners-security \ No newline at end of file +.githooks/pre-commit @centreon/owners-security +.githooks/pre-commit.d/*_gitleaks.sh @centreon/owners-security +.githooks/pre-push @centreon/owners-security +.githooks/pre-push.d/*_gitleaks.sh @centreon/owners-security +.gitleaks.toml @centreon/owners-security +.gitleaksignore @centreon/owners-security +**/dependency-analysis.yml @centreon/owners-security +**/gitleaks-analysis.yml @centreon/owners-security +**/secu-*.yml @centreon/owners-security \ No newline at end of file From 0de994e9d60a021809b46cde8e4941930812d73d Mon Sep 17 00:00:00 2001 From: tuntoja <58987095+tuntoja@users.noreply.github.com> Date: Mon, 27 Jul 2026 09:16:03 +0200 Subject: [PATCH 2/9] Empty-Commit (#365) Bypass since nothing changed just for history From cc9989a98dda0e24ce69777656a4aefe3bd8654c Mon Sep 17 00:00:00 2001 From: technique-ci <87815335+technique-ci@users.noreply.github.com> Date: Mon, 27 Jul 2026 16:37:16 +0200 Subject: [PATCH 3/9] chore(deps): absorb 2026-07 dependabot GitHub Actions updates (#361) * chore(deps): bump actions/setup-python from 6.2.0 to 6.3.0 (#360) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.2.0 to 6.3.0. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/a309ff8b426b58ec0e2a45f0f869d46889d02405...ece7cb06caefa5fff74198d8649806c4678c61a1) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: 6.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump docker/build-push-action from 7.0.0 to 7.3.0 (#359) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.0.0 to 7.3.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/d08e5c354a6adb9ed34480a06d141179aa583294...53b7df96c91f9c12dcc8a07bcb9ccacbed38856a) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: 7.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump actions/checkout from 6.0.2 to 7.0.0 (#358) Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 7.0.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump docker/login-action from 4.0.0 to 4.2.0 (#354) Bumps [docker/login-action](https://github.com/docker/login-action) from 4.0.0 to 4.2.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/b45d80f862d83dbcd57f89517bcf500b2ab88fb2...650006c6eb7dba73a995cc03b0b2d7f5ca915bee) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: 4.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump actions/github-script from 8.0.0 to 9.0.0 (#353) Bumps [actions/github-script](https://github.com/actions/github-script) from 8.0.0 to 9.0.0. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/ed597411d8f924073f98dfc5c65a23a2325f34cd...3a2844b7e9c422d3c10d287c895573f7108da1b3) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: 9.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump actions/upload-artifact from 5.0.0 to 7.0.1 (#352) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5.0.0 to 7.0.1. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/330a01c490aca151604b8cf639adc76d48f6c5d4...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump docker/setup-buildx-action from 4.0.0 to 4.1.0 (#350) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd...d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-version: 4.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Maud <110405507+mushroomempires@users.noreply.github.com> --- .github/workflows/actionlint.yml | 6 +++--- .github/workflows/docker-packaging.yml | 8 ++++---- .github/workflows/get-environment.yml | 2 +- .github/workflows/lua-cffi.yml | 12 ++++++------ .github/workflows/lua-lsqlite3.yml | 10 +++++----- .github/workflows/lua-sql-mysql.yml | 10 +++++----- .github/workflows/lua-tz.yml | 12 ++++++------ .../workflows/set-pull-request-external-label.yml | 2 +- .github/workflows/stream-connectors-lib.yml | 10 +++++----- .github/workflows/stream-connectors.yml | 12 ++++++------ 10 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml index 38955872..cb9d2f19 100644 --- a/.github/workflows/actionlint.yml +++ b/.github/workflows/actionlint.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Download actionlint id: get_actionlint @@ -45,9 +45,9 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: '3.12' diff --git a/.github/workflows/docker-packaging.yml b/.github/workflows/docker-packaging.yml index 962c4fd7..9feb6bb4 100644 --- a/.github/workflows/docker-packaging.yml +++ b/.github/workflows/docker-packaging.yml @@ -30,18 +30,18 @@ jobs: distrib: [alma8, alma9, alma10, bullseye, bookworm, trixie, jammy, noble] steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Login to registry - uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 + uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 with: registry: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }} username: ${{ secrets.HARBOR_CENTREON_PUSH_USERNAME }} password: ${{ secrets.HARBOR_CENTREON_PUSH_TOKEN }} - - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + - uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 - - uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0 + - uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0 with: file: .github/docker/Dockerfile.packaging-stream-connectors-nfpm-${{ matrix.distrib }} context: . diff --git a/.github/workflows/get-environment.yml b/.github/workflows/get-environment.yml index 89ac5fc9..ccc92a25 100644 --- a/.github/workflows/get-environment.yml +++ b/.github/workflows/get-environment.yml @@ -12,7 +12,7 @@ jobs: stability: ${{ steps.get_environment.outputs.stability }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - id: get_environment run: | diff --git a/.github/workflows/lua-cffi.yml b/.github/workflows/lua-cffi.yml index de2051f5..a0ecc295 100644 --- a/.github/workflows/lua-cffi.yml +++ b/.github/workflows/lua-cffi.yml @@ -71,7 +71,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install dependencies env: @@ -92,7 +92,7 @@ jobs: shell: bash - name: Checkout cffi-lua sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: repository: "q66/cffi-lua" path: "cffi-lua-src" @@ -169,7 +169,7 @@ jobs: name: Test lua packages on ${{ matrix.package_extension }} ${{ matrix.distrib }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Test packaged libs uses: ./.github/actions/test-packages @@ -181,7 +181,7 @@ jobs: - name: Upload error log if: failure() - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: install_error_log_${{ matrix.distrib }} path: install_error_${{ matrix.distrib }}.log @@ -197,7 +197,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish RPM packages uses: ./.github/actions/rpm-delivery @@ -219,7 +219,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish DEB packages uses: ./.github/actions/deb-delivery diff --git a/.github/workflows/lua-lsqlite3.yml b/.github/workflows/lua-lsqlite3.yml index f0b3fff9..6945616b 100644 --- a/.github/workflows/lua-lsqlite3.yml +++ b/.github/workflows/lua-lsqlite3.yml @@ -79,7 +79,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Prepare packaging of lua-lsqlite3 env: @@ -161,7 +161,7 @@ jobs: name: Test lua packages on ${{ matrix.package_extension }} ${{ matrix.distrib }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Test packaged libs uses: ./.github/actions/test-packages @@ -173,7 +173,7 @@ jobs: - name: Upload error log if: failure() - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: install_error_log_${{ matrix.distrib }} path: install_error_${{ matrix.distrib }}.log @@ -189,7 +189,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish RPM packages uses: ./.github/actions/rpm-delivery @@ -211,7 +211,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish DEB packages uses: ./.github/actions/deb-delivery diff --git a/.github/workflows/lua-sql-mysql.yml b/.github/workflows/lua-sql-mysql.yml index f6936db0..db982cee 100644 --- a/.github/workflows/lua-sql-mysql.yml +++ b/.github/workflows/lua-sql-mysql.yml @@ -56,10 +56,10 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Checkout luasql sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: repository: "lunarmodules/luasql" path: "lua-sql-src" @@ -128,7 +128,7 @@ jobs: name: Test lua packages on ${{ matrix.package_extension }} ${{ matrix.distrib }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Test packaged libs uses: ./.github/actions/test-packages @@ -140,7 +140,7 @@ jobs: - name: Upload error log if: failure() - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: install_error_log_${{ matrix.distrib }} path: install_error_${{ matrix.distrib }}.log @@ -156,7 +156,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish RPM packages uses: ./.github/actions/rpm-delivery diff --git a/.github/workflows/lua-tz.yml b/.github/workflows/lua-tz.yml index 2b1d97e9..fce3571d 100644 --- a/.github/workflows/lua-tz.yml +++ b/.github/workflows/lua-tz.yml @@ -71,10 +71,10 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Checkout luatz sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: repository: "daurnimator/luatz" path: "luatz-src" @@ -138,7 +138,7 @@ jobs: name: Test lua packages on ${{ matrix.package_extension }} ${{ matrix.distrib }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Test packaged libs uses: ./.github/actions/test-packages @@ -150,7 +150,7 @@ jobs: - name: Upload error log if: failure() - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: install_error_log_${{ matrix.distrib }} path: install_error_${{ matrix.distrib }}.log @@ -166,7 +166,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish RPM packages uses: ./.github/actions/rpm-delivery @@ -188,7 +188,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish DEB packages uses: ./.github/actions/deb-delivery diff --git a/.github/workflows/set-pull-request-external-label.yml b/.github/workflows/set-pull-request-external-label.yml index fa352dac..519b124e 100644 --- a/.github/workflows/set-pull-request-external-label.yml +++ b/.github/workflows/set-pull-request-external-label.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Set PR external label - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const label = 'external'; diff --git a/.github/workflows/stream-connectors-lib.yml b/.github/workflows/stream-connectors-lib.yml index eb4d5c17..1e959c5b 100644 --- a/.github/workflows/stream-connectors-lib.yml +++ b/.github/workflows/stream-connectors-lib.yml @@ -73,7 +73,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Package uses: ./.github/actions/package-nfpm @@ -127,7 +127,7 @@ jobs: image: ${{ matrix.image }} name: test packages on ${{ matrix.package_extension }} ${{ matrix.distrib }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Test packaged libs uses: ./.github/actions/test-packages @@ -139,7 +139,7 @@ jobs: - name: Upload error log if: failure() - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: install_error_log_${{ matrix.distrib }} path: install_error_${{ matrix.distrib }}.log @@ -155,7 +155,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish RPM packages uses: ./.github/actions/rpm-delivery @@ -177,7 +177,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish DEB packages uses: ./.github/actions/deb-delivery diff --git a/.github/workflows/stream-connectors.yml b/.github/workflows/stream-connectors.yml index 338c0574..f4d42612 100644 --- a/.github/workflows/stream-connectors.yml +++ b/.github/workflows/stream-connectors.yml @@ -34,7 +34,7 @@ jobs: connectors: ${{ steps.list-connectors.outputs.connectors }} packaging: ${{ steps.filter.outputs.packaging }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 id: filter @@ -115,7 +115,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Replace package and connector name variables env: @@ -216,7 +216,7 @@ jobs: image: ${{ matrix.image }} name: Test ${{ matrix.distrib }} ${{ matrix.connector_path }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Test packaged connector uses: ./.github/actions/test-packages @@ -228,7 +228,7 @@ jobs: - name: Upload error log if: failure() - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: install_error_log_${{ matrix.connector_path }}_${{ matrix.distrib }} path: install_error_${{ matrix.distrib }}.log @@ -245,7 +245,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish RPM packages uses: ./.github/actions/rpm-delivery @@ -268,7 +268,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Publish DEB packages uses: ./.github/actions/deb-delivery From 0eaa74a9a81c28ec211082229b9a6276919a389c Mon Sep 17 00:00:00 2001 From: tcharles Date: Fri, 31 Jul 2026 15:26:40 +0200 Subject: [PATCH 4/9] fix condition for canopsis ack event (#367) Refs: CTOR-2479 --- centreon-certified/canopsis/canopsis2x-events-apiv2.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/centreon-certified/canopsis/canopsis2x-events-apiv2.lua b/centreon-certified/canopsis/canopsis2x-events-apiv2.lua index 240c44be..38c56749 100644 --- a/centreon-certified/canopsis/canopsis2x-events-apiv2.lua +++ b/centreon-certified/canopsis/canopsis2x-events-apiv2.lua @@ -417,7 +417,7 @@ function EventQueue:format_event_acknowledgement() -- ack_resources = false } - if event.service_id then + if event.service_id and event.service_id ~= 0 then self.sc_event.event.formated_event['source_type'] = "resource" self.sc_event.event.formated_event['resource'] = tostring(event.cache.service.description) -- only with v2 api ? From b73f2e66a8ad39b63b82170443e2055ae9496d57 Mon Sep 17 00:00:00 2001 From: Evan-Adam <152897682+Evan-Adam@users.noreply.github.com> Date: Fri, 31 Jul 2026 15:27:52 +0200 Subject: [PATCH 5/9] enh(flush): reduce log when queue is empty and broker don't send new messages (#300) Refs: CTOR-2483 --- modules/centreon-stream-connectors-lib/sc_flush.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/centreon-stream-connectors-lib/sc_flush.lua b/modules/centreon-stream-connectors-lib/sc_flush.lua index f9c6a68d..1c409b90 100644 --- a/modules/centreon-stream-connectors-lib/sc_flush.lua +++ b/modules/centreon-stream-connectors-lib/sc_flush.lua @@ -166,9 +166,11 @@ function ScFlush:get_queues_size() for _, element_info in pairs(self.params.accepted_elements_info) do queues_size = queues_size + #self.queues[element_info.category_id][element_info.element_id].events - self.sc_logger:debug("[sc_flush:get_queues_size]: size of queue for category " .. tostring(element_info.category_name) - .. " and element: " .. tostring(element_info.element_name) - .. " is: " .. tostring(#self.queues[element_info.category_id][element_info.element_id].events)) + if #self.queues[element_info.category_id][element_info.element_id].events > 0 then + self.sc_logger:debug("[sc_flush:get_queues_size]: size of queue for category " .. tostring(element_info.category_name) + .. " and element: " .. tostring(element_info.element_name) + .. " is: " .. tostring(#self.queues[element_info.category_id][element_info.element_id].events)) + end end return queues_size From 830cad36c5997a1f750abde2e4617ef5780c7566 Mon Sep 17 00:00:00 2001 From: omercier <32134301+omercier@users.noreply.github.com> Date: Thu, 6 Aug 2026 09:11:18 +0200 Subject: [PATCH 6/9] enh(splunk-metrics): optimize Splunk metrics stream connector to avoid DOS (#288) Refs: CTOR-1681, CTOR-2057 --- .../splunk/splunk-metrics-apiv2.lua | 399 ++++++++---------- 1 file changed, 182 insertions(+), 217 deletions(-) diff --git a/centreon-certified/splunk/splunk-metrics-apiv2.lua b/centreon-certified/splunk/splunk-metrics-apiv2.lua index ebb69dd2..88b8cce6 100644 --- a/centreon-certified/splunk/splunk-metrics-apiv2.lua +++ b/centreon-certified/splunk/splunk-metrics-apiv2.lua @@ -1,7 +1,6 @@ #!/usr/bin/lua --------------------------------------------------------------------------------- --- Centreon Broker Splunk Connector Events --------------------------------------------------------------------------------- + +-- Centreon Broker Splunk Metrics Stream Connector -- Libraries local curl = require "cURL" @@ -13,20 +12,14 @@ local sc_flush = require("centreon-stream-connectors-lib.sc_flush") local sc_params = require("centreon-stream-connectors-lib.sc_params") local sc_storage = require("centreon-stream-connectors-lib.sc_storage") --------------------------------------------------------------------------------- --- Classe event_queue --------------------------------------------------------------------------------- - -local EventQueue = {} -EventQueue.__index = EventQueue - --------------------------------------------------------------------------------- ----- Constructor ----- @param conf The table given by the init() function and returned from the GUI ----- @return the new EventQueue ----------------------------------------------------------------------------------- +-- event_queue class +local event_queue = {} +event_queue.__index = event_queue -function EventQueue.new(params) +--- Constructor +--- @param conf table given by the init() function and returned from the GUI +--- @return table the new event_queue +function event_queue.new(params) local self = {} local mandatory_parameters = { @@ -52,19 +45,20 @@ function EventQueue.new(params) end -- overriding default parameters for this stream connector if the default values doesn't suit the basic needs - self.sc_params.params.splunk_index = params.splunk_index or "" - self.sc_params.params.splunk_source = params.splunk_source or "" - self.sc_params.params.splunk_sourcetype = params.splunk_sourcetype or "_json" - self.sc_params.params.splunk_host = params.splunk_host or "Central" - self.sc_params.params.accepted_categories = params.accepted_categories or "neb" - self.sc_params.params.accepted_elements = params.accepted_elements or "host_status,service_status" - self.sc_params.params.max_buffer_size = params.max_buffer_size or 30 - self.sc_params.params.hard_only = params.hard_only or 0 - self.sc_params.params.enable_host_status_dedup = params.enable_host_status_dedup or 0 - self.sc_params.params.enable_service_status_dedup = params.enable_service_status_dedup or 0 - self.sc_params.params.metric_name_regex = params.metric_name_regex or "[^a-zA-Z0-9_]" + self.sc_params.params.splunk_index = params.splunk_index or "" + self.sc_params.params.splunk_source = params.splunk_source or "" + self.sc_params.params.splunk_sourcetype = params.splunk_sourcetype or "_json" + self.sc_params.params.splunk_host = params.splunk_host or "Central" + self.sc_params.params.accepted_categories = params.accepted_categories or "neb" + self.sc_params.params.accepted_elements = params.accepted_elements or "host_status,service_status" + self.sc_params.params.max_buffer_size = params.max_buffer_size or 30 + self.sc_params.params.hard_only = params.hard_only or 0 + self.sc_params.params.enable_host_status_dedup = params.enable_host_status_dedup or 0 + self.sc_params.params.enable_service_status_dedup = params.enable_service_status_dedup or 0 + self.sc_params.params.metric_name_regex = params.metric_name_regex or "[^a-zA-Z0-9_]" self.sc_params.params.metric_replacement_character = params.metric_replacement_character or "_" - + self.sc_params.params.verify_certificate = params.verify_certificate or true + -- apply users params and check syntax of standard ones self.sc_params:param_override(params) self.sc_params:check_params() @@ -74,7 +68,7 @@ function EventQueue.new(params) -- only load the custom code file, not executed yet if self.sc_params.load_custom_code_file and not self.sc_params:load_custom_code_file(self.sc_params.params.custom_code_file) then - self.sc_logger:error("[EventQueue:new]: couldn't successfully load the custom code file: " .. tostring(self.sc_params.params.custom_code_file)) + self.sc_logger:error("[event_queue:new]: couldn't successfully load the custom code file: " .. tostring(self.sc_params.params.custom_code_file)) end self.sc_params:build_accepted_elements_info() @@ -83,35 +77,18 @@ function EventQueue.new(params) self.sc_storage = sc_storage.new(self.sc_common, self.sc_logger, self.sc_params.params) local categories = self.sc_params.params.bbdo.categories - local elements = self.sc_params.params.bbdo.elements - - -- it is not possible to have a payload containing metrics from different hosts or services. - -- therefore, we need to check if the metric that we are working on belongs to the same host/service than the previous metric - -- that's why we initiate a structure to store this info - self.previous_info = { - [categories.neb.id] = { - [elements.host_status.id] = { - host_id = "", - flush_success = false - }, - [elements.service_status.id] = { - host_id = "", - service_id = "", - flush_success = false - } - } - } + local elements = self.sc_params.params.bbdo.elements self.format_event = { [categories.neb.id] = { - [elements.host_status.id] = function () return self:format_event_host() end, + [elements.host_status.id] = function () return self:format_event_host() end, [elements.service_status.id] = function () return self:format_event_service() end } } self.format_metric = { [categories.neb.id] = { - [elements.host_status.id] = function (metric) return self:format_metric_host(metric) end, + [elements.host_status.id] = function (metric) return self:format_metric_host(metric) end, [elements.service_status.id] = function (metric) return self:format_metric_service(metric) end } } @@ -124,22 +101,26 @@ function EventQueue.new(params) [1] = function (payload, event) return self:build_payload(payload, event) end } + -- Since this stream connector sends metrics and since all the metrics of one service are sent as one event + -- the volume of data can be really high if some services contain hundreds of metrics. + -- To avoid sending megabytes in one request, we will use a custom queue size attribute + self.custom_queue_size = 0 -- those sleep counters will avoid log spam and connection spam self.send_data_sleep_counter = self.sc_common:create_sleep_counter_table({}, 0, 300, 10) self.init_fail_sleep_counter = self.sc_common:create_sleep_counter_table({}, 0, 300, 10) - -- return EventQueue object - setmetatable(self, { __index = EventQueue }) + -- return event_queue object + setmetatable(self, { __index = event_queue }) return self end --------------------------------------------------------------------------------- ----- EventQueue:format_event method ----------------------------------------------------------------------------------- -function EventQueue:format_accepted_event() +--- Calls the adequate format_event_* function and then +--- calls add() functions +--- @return void +function event_queue:format_accepted_event() local category = self.sc_event.event.category local element = self.sc_event.event.element - self.sc_logger:debug("[EventQueue:format_event]: starting format event") + self.sc_logger:debug("[event_queue:format_event]: starting format event") -- can't format event if stream connector is not handling this kind of event if not self.format_event[category][element] then @@ -148,88 +129,17 @@ function EventQueue:format_accepted_event() .. tostring(self.sc_params.params.reverse_element_mapping[category][element]) .. ". If it is a not a misconfiguration, you can open an issue at https://github.com/centreon/centreon-stream-connector-scripts/issues") else - self.sc_logger:debug("[EventQueue:format_event]: going to format it") + self.sc_logger:debug("[event_queue:format_event]: going to format it") self.format_event[category][element]() end - self.sc_logger:debug("[EventQueue:format_event]: event formatting is finished") + self.sc_logger:debug("[event_queue:format_event]: event formatting is finished") end - --------------------------------------------------------------------------------- ----- EventQueue:format_event_host method --------------------------------------------------------------------------------- -function EventQueue:format_event_host() - local event = self.sc_event.event - self.previous_info[event.category][event.element].flush_success = false - - -- this is the first time we receive a metric from a host, we store host id in the table - if self.previous_info[event.category][event.element].host_id == "" then - self.previous_info[event.category][event.element].host_id = event.host_id - else - -- the event is linked to a new host, we can't send payload with data from different hosts so we force a data flush - -- we store the new host id and then we continue working on metrics from said host - if self.previous_info[event.category][event.element].host_id ~= event.host_id then - while not self.previous_info[event.category][event.element].flush_success do - if self.sc_flush:flush_all_queues(self.build_payload_method[1], self.send_data_method[1]) then - self.previous_info[event.category][event.element].flush_success = true - self.send_data_sleep_counter:reset() - else - self.send_data_sleep_counter:sleep() - end - end - - self.previous_info[event.category][event.element].host_id = event.host_id - end - end - - self.sc_logger:debug("[EventQueue:format_event_host]: call build_metric ") - self.sc_metrics:build_metric(self.format_metric[event.category][event.element]) -end - --------------------------------------------------------------------------------- ----- EventQueue:format_event_service method --------------------------------------------------------------------------------- -function EventQueue:format_event_service() - local event = self.sc_event.event - self.previous_info[event.category][event.element].flush_success = false - - -- this is the first time we receive a metric from a servuce, we store host id and service id in the table - if self.previous_info[event.category][event.element].host_id == "" - or self.previous_info[event.category][event.element].service_id == "" - then - self.previous_info[event.category][event.element].host_id = event.host_id - self.previous_info[event.category][event.element].service_id = event.service_id - else - if self.previous_info[event.category][event.element].host_id ~= event.host_id - or self.previous_info[event.category][event.element].service_id ~= event.service_id - then - -- the event is linked to a new service, we can't send payload with data from different services so we force a data flush - -- we store the new host and service id and then we continue working on metrics from said service - while not self.previous_info[event.category][event.element].flush_success do - if self.sc_flush:flush_all_queues(self.build_payload_method[1], self.send_data_method[1]) then - self.previous_info[event.category][event.element].flush_success = true - self.send_data_sleep_counter:reset() - else - self.send_data_sleep_counter:sleep() - end - end - - self.previous_info[event.category][event.element].host_id = event.host_id - self.previous_info[event.category][event.element].service_id = event.service_id - end - end - - self.sc_logger:debug("[EventQueue:format_event_service]: call build_metric ") - self.sc_metrics:build_metric(self.format_metric[event.category][event.element]) -end - --------------------------------------------------------------------------------- ----- EventQueue:format_metric_host method --- @param metric {table} a single metric data --------------------------------------------------------------------------------- -function EventQueue:format_metric_host(metric) - self.sc_logger:debug("[EventQueue:format_metric_host]: call format_metric ") +--- Formats host events by calling the format_metric() function defined for host status events +--- @return void +function event_queue:format_event_host() + self.sc_logger:debug("[event_queue:format_event_host]: starting format event host.") local event = self.sc_event.event self.sc_event.event.formated_event = { @@ -237,18 +147,29 @@ function EventQueue:format_metric_host(metric) state = event.state, state_type = event.state_type, hostname = event.cache.host.name, + hostaddress = event.cache.host.address, + lastchange = event.last_hard_state_change, ctime = event.last_check } + -- Add ACK & Downtime + event.formated_event["acknowledge"] = event.acknowledged + event.formated_event["downtime"] = event.scheduled_downtime_depth - self:format_metric_event(metric) + -- Add hostgroup + if event.cache.host.groups then + event.formated_event["hostgroups"] = event.cache.host.groups + end + + self.sc_metrics:build_metric(self.format_metric[event.category][event.element]) + self:add() + + self.sc_logger:debug("[event_queue:format_event_host]: format event host is finished ") end --------------------------------------------------------------------------------- ----- EventQueue:format_metric_service method --- @param metric {table} a single metric data --------------------------------------------------------------------------------- -function EventQueue:format_metric_service(metric) - self.sc_logger:debug("[EventQueue:format_metric_service]: call format_metric ") +--- Formats service events by calling the format_metric() function defined for service status events +--- @return void +function event_queue:format_event_service() + self.sc_logger:debug("[event_queue:format_event_service]: starting format event service.") local event = self.sc_event.event self.sc_event.event.formated_event = { @@ -256,82 +177,123 @@ function EventQueue:format_metric_service(metric) state = event.state, state_type = event.state_type, hostname = event.cache.host.name, + hostaddress = event.cache.host.address, service_description = event.cache.service.description, + lastchange = event.last_hard_state_change, ctime = event.last_check } + -- Add ACK & Downtime + event.formated_event["acknowledge"] = event.acknowledged + event.formated_event["downtime"] = event.scheduled_downtime_depth + + -- Add hostgroup + if event.cache.host.groups then + event.formated_event["hostgroups"] = event.cache.host.groups + end + + self.sc_metrics:build_metric(self.format_metric[event.category][event.element]) + self:add() + + self.sc_logger:debug("[event_queue:format_event_service]: format event service is finished ") +end + +--- Prepare a formatted metric event based on a service status event +--- @param metric table A single metric's data +--- @return void +function event_queue:format_metric_host(metric) + self.sc_logger:debug("[event_queue:format_metric_host]: call format metric ") self:format_metric_event(metric) + + self.sc_logger:debug("[event_queue:format_metric_host]: Finishing") end --------------------------------------------------------------------------------- ----- EventQueue:build_metadata method --- @param metric {table} a single metric data --- @return tags {table} a table with formated metadata --------------------------------------------------------------------------------- -function EventQueue:format_metric_event(metric) - self.sc_logger:debug("[EventQueue:format_metric]: start real format metric ") - self.sc_event.event.formated_event["metric_name:" .. tostring(metric.metric_name)] = metric.value - - -- add metric instance in tags +--- Prepare a formatted metric event based on a service status event +--- @param metric table a single metric's data +--- @return void +function event_queue:format_metric_service(metric) + self.sc_logger:debug("[event_queue:format_metric_service]: Beginning to format metric ") + + self:format_metric_event(metric) + + self.sc_logger:debug("[event_queue:format_metric_service]: Finishing") +end + +--- Completes the formatting of a metric event and calls add() to adds it to the events list +--- @param metric table a single metric's data +--- @return void +function event_queue:format_metric_event(metric) + self.sc_logger:debug("[event_queue:format_metric]: start real format metric ") + local full_metric_name = '' + + -- add metric instance if metric.instance ~= "" then - self.sc_event.event.formated_event["instance"] = metric.instance + full_metric_name = metric.instance .. '_' end - - if metric.subinstance[1] then - self.sc_event.event.formated_event["subinstances"] = metric.subinstance + + for _, sub_instance in ipairs(metric.subinstance) do + full_metric_name = full_metric_name .. sub_instance .. '_' end - - self:add() - self.sc_logger:debug("[EventQueue:format_metric]: end real format metric ") + full_metric_name = full_metric_name .. tostring(metric.metric_name) + + self.sc_event.event.formated_event["metric_name:" .. full_metric_name] = metric.value + self.custom_queue_size = self.custom_queue_size + 1 + + self.sc_logger:debug("[event_queue:format_metric]: end real format metric ") end --------------------------------------------------------------------------------- --- EventQueue:add, add an event to the sending queue --------------------------------------------------------------------------------- -function EventQueue:add() +--- Adds an event to the sending queue +--- @return void +function event_queue:add() local category = self.sc_event.event.category local element = self.sc_event.event.element - self.sc_logger:debug("[EventQueue:add]: add event in queue category: " .. tostring(self.sc_params.params.reverse_category_mapping[category]) + self.sc_logger:debug("[event_queue:add]: add event in queue category: " .. tostring(self.sc_params.params.reverse_category_mapping[category]) .. " element: " .. tostring(self.sc_params.params.reverse_element_mapping[category][element])) - self.sc_logger:debug("[EventQueue:add]: queue size before adding event: " .. tostring(#self.sc_flush.queues[category][element].events)) + self.sc_logger:debug("[event_queue:add]: queue size before adding event: " .. tostring(#self.sc_flush.queues[category][element].events)) self.sc_flush.queues[category][element].events[#self.sc_flush.queues[category][element].events + 1] = self.sc_event.event.formated_event - self.sc_logger:info("[EventQueue:add]: queue size is now: " .. tostring(#self.sc_flush.queues[category][element].events) + self.sc_logger:info("[event_queue:add]: queue size is now: " .. tostring(self.custom_queue_size) .. ", max is: " .. tostring(self.sc_params.params.max_buffer_size)) end --------------------------------------------------------------------------------- --- EventQueue:build_payload, concatenate data so it is ready to be sent --- @param payload {string} json encoded string --- @param event {table} the event that is going to be added to the payload --- @return payload {string} json encoded string --------------------------------------------------------------------------------- -function EventQueue:build_payload(payload, event) +--- Concatenates data so it is ready to be sent +--- @param payload string json encoded string +--- @param event table the event that is going to be added to the payload +--- @return string json encoded string +function event_queue:build_payload(payload, event) + self.sc_logger:debug("[event_queue:build_payload]: Starting to build payload") + local data_to_send = { + sourcetype = self.sc_params.params.splunk_sourcetype, + source = self.sc_params.params.splunk_source, + index = self.sc_params.params.splunk_index, + host = self.sc_params.params.splunk_host, + time = self.sc_event.event.last_check, + event = event + } + if not payload then - payload = event + payload = { data_to_send } else - for index, value in pairs(event) do - payload[index] = value - end + table.insert(payload, data_to_send) end - + + self.sc_logger:debug("[event_queue:build_payload]: Finishing to build payload") return payload end -function EventQueue:send_data(payload, queue_metadata) - self.sc_logger:debug("[EventQueue:send_data]: Starting to send data") - - payload = broker.json_encode({ - sourcetype = self.sc_params.params.splunk_sourcetype, - source = self.sc_params.params.splunk_source, - index = self.sc_params.params.splunk_index, - host = self.sc_params.params.splunk_host, - time = self.sc_event.event.last_check, - fields = payload - }) +--- Attempts to send the data +--- @param payload table Object to send +--- @param queue_metadata table metadata to use for sending data +--- @return boolean json encoded string +function event_queue:send_data(payload, queue_metadata) + self.sc_logger:debug("[event_queue:send_data]: Starting to send data") + + -- until this line, the payload variable contains an array of objects + payload = broker.json_encode( payload ) + -- now it is a JSON string with the former table encoded under the event attribute queue_metadata.headers = { "content-type: application/json", @@ -340,16 +302,14 @@ function EventQueue:send_data(payload, queue_metadata) } local url = self.sc_params.params.http_server_url - self.sc_logger:log_curl_command(url, queue_metadata, self.sc_params.params, payload) - -- write payload in the logfile for test purpose if self.sc_params.params.send_data_test == 1 then self.sc_logger:notice("[send_data]: " .. tostring(payload)) return true end - self.sc_logger:info("[EventQueue:send_data]: Going to send the following json " .. tostring(payload)) - self.sc_logger:info("[EventQueue:send_data]: Splunk address is: " .. tostring(url)) + self.sc_logger:debug("[event_queue:send_data]: Going to send the following json " .. tostring(payload)) + self.sc_logger:debug("[event_queue:send_data]: Splunk address is: " .. tostring(url)) local http_response_body = "" local http_request = curl.easy() @@ -359,8 +319,9 @@ function EventQueue:send_data(payload, queue_metadata) http_response_body = http_response_body .. tostring(response) end ) - :setopt(curl.OPT_TIMEOUT, self.sc_params.params.connection_timeout) :setopt(curl.OPT_SSL_VERIFYPEER, self.sc_params.params.verify_certificate) + :setopt(curl.OPT_SSL_VERIFYHOST, self.sc_params.params.verify_certificate) + :setopt(curl.OPT_TIMEOUT, self.sc_params.params.connection_timeout) :setopt(curl.OPT_HTTPHEADER, queue_metadata.headers) -- set proxy address configuration @@ -368,7 +329,7 @@ function EventQueue:send_data(payload, queue_metadata) if (self.sc_params.params.proxy_port ~= '') then http_request:setopt(curl.OPT_PROXY, self.sc_params.params.proxy_address .. ':' .. self.sc_params.params.proxy_port) else - self.sc_logger:error("[EventQueue:send_data]: proxy_port parameter is not set but proxy_address is used") + self.sc_logger:error("[event_queue:send_data]: proxy_port parameter is not set but proxy_address is used") end end @@ -377,16 +338,21 @@ function EventQueue:send_data(payload, queue_metadata) if (self.sc_params.params.proxy_password ~= '') then http_request:setopt(curl.OPT_PROXYUSERPWD, self.sc_params.params.proxy_username .. ':' .. self.sc_params.params.proxy_password) else - broker_log:error("[EventQueue:send_data]: proxy_password parameter is not set but proxy_username is used") + self.sc_logger:error("[event_queue:send_data]: proxy_password parameter is not set but proxy_username is used") end end -- adding the HTTP POST data http_request:setopt_postfields(payload) + -- for troubleshooting purpose + self.sc_logger:log_curl_command(url, queue_metadata, self.sc_params.params, payload) + -- performing the HTTP request + self.sc_logger:debug("[event_queue:send_data]: performing request") http_request:perform() - + self.sc_logger:debug("[event_queue:send_data]: request performed") + -- collecting results http_response_code = http_request:getinfo(curl.INFO_RESPONSE_CODE) @@ -395,35 +361,31 @@ function EventQueue:send_data(payload, queue_metadata) -- Handling the return code local retval = false if http_response_code == 200 then - self.sc_logger:info("[EventQueue:send_data]: HTTP POST request successful: return code is " .. tostring(http_response_code)) + self.sc_logger:info("[event_queue:send_data]: HTTP POST request successful: return code is " .. tostring(http_response_code)) retval = true else - self.sc_logger:error("[EventQueue:send_data]: HTTP POST request FAILED, return code is " .. tostring(http_response_code) .. ". Message is: " .. tostring(http_response_body)) + self.sc_logger:error("[event_queue:send_data]: HTTP POST request FAILED, return code is " .. tostring(http_response_code) .. ". Message is: " .. tostring(http_response_body)) if payload then - self.sc_logger:error("[EventQueue:send_data]: sent payload was: " .. tostring(payload)) + self.sc_logger:error("[event_queue:send_data]: sent payload was: " .. tostring(payload)) end end return retval end --------------------------------------------------------------------------------- --- Required functions for Broker StreamConnector --------------------------------------------------------------------------------- - local queue --- Fonction init() +--- Required function for Broker Stream Connector +--- @param conf table Parameters of the stream connector +--- @return void function init(conf) - queue = EventQueue.new(conf) + queue = event_queue.new(conf) end --- -------------------------------------------------------------------------------- --- write, --- @param {table} event, the event from broker --- @return {boolean} --------------------------------------------------------------------------------- +--- Required function for Broker Stream Connector +--- @param event table the event from broker +--- @return boolean true if everything went well, false otherwise function write (event) -- skip event if a mandatory parameter is missing if queue.fail then @@ -454,39 +416,42 @@ function write (event) queue.sc_logger:debug("dropping event because category is not valid. Event category is: " .. tostring(queue.sc_params.params.reverse_category_mapping[queue.sc_event.event.category])) end - + queue.sc_logger:debug("[write]: Calling flush() function ") return flush() end - -- flush method is called by broker every now and then (more often when broker has nothing else to do) function flush() - local queues_size = queue.sc_flush:get_queues_size() - + queue.sc_logger:debug("[flush]: Function starting") + local queues_size = queue.custom_queue_size + queue.sc_logger:debug("[flush]: queue size is now: " .. queues_size .. ", max is: " .. queue.sc_params.params.max_buffer_size) + -- nothing to flush if queues_size == 0 then + queue.sc_logger:debug("[flush]: Function finishing without flushing (queue empty)") return true end -- flush all queues because last global flush is too old if queue.sc_flush.last_global_flush < os.time() - queue.sc_params.params.max_all_queues_age then + queue.sc_logger:debug("[flush]: Time to flush: max age reached") if not queue.sc_flush:flush_all_queues(queue.build_payload_method[1], queue.send_data_method[1]) then return false end - + queue.custom_queue_size = 0 return true end -- flush queues because too many events are stored in them if queues_size > queue.sc_params.params.max_buffer_size then + queue.sc_logger:debug("[flush]: Time to flush: max size reached") if not queue.sc_flush:flush_all_queues(queue.build_payload_method[1], queue.send_data_method[1]) then return false end - + queue.custom_queue_size = 0 return true end - + queue.sc_logger:debug("[flush]: Function finishing without flushing") -- there are events in the queue but they were not ready to be send return false end - From 4d454769dbca04a2d81a28f31e235d3cbd86c5a3 Mon Sep 17 00:00:00 2001 From: sdepassio <114986849+sdepassio@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:03:59 +0200 Subject: [PATCH 7/9] feat(community): add opentelemetry otelhttp stream connector for metrics (#375) Co-authored-by: cgagnaire Refs: CTOR-1807 --- .github/workflows/stream-connectors-lib.yml | 2 +- ...ntelemetry-otelhttp-json-metrics-apiv2.lua | 483 ++++++++++++++++++ 2 files changed, 484 insertions(+), 1 deletion(-) create mode 100644 community-powered/opentelemetry/opentelemetry-otelhttp-json-metrics-apiv2.lua diff --git a/.github/workflows/stream-connectors-lib.yml b/.github/workflows/stream-connectors-lib.yml index 1e959c5b..826b5b61 100644 --- a/.github/workflows/stream-connectors-lib.yml +++ b/.github/workflows/stream-connectors-lib.yml @@ -80,7 +80,7 @@ jobs: with: nfpm_file_pattern: "packaging/connectors-lib/*.yaml" distrib: ${{ matrix.distrib }} - version: "3.8.0" # previous version:"3.7.0" + version: "3.8.1" # previous version:"3.8.0" release: "1" package_extension: ${{ matrix.package_extension }} arch: all diff --git a/community-powered/opentelemetry/opentelemetry-otelhttp-json-metrics-apiv2.lua b/community-powered/opentelemetry/opentelemetry-otelhttp-json-metrics-apiv2.lua new file mode 100644 index 00000000..d11204d7 --- /dev/null +++ b/community-powered/opentelemetry/opentelemetry-otelhttp-json-metrics-apiv2.lua @@ -0,0 +1,483 @@ +#!/usr/bin/lua +-------------------------------------------------------------------------------- +-- Centreon Broker OpenTelemetry OTLP/HTTP JSON Encoding Connector Metrics +-------------------------------------------------------------------------------- + + +-- Libraries +local curl = require "cURL" +local sc_common = require("centreon-stream-connectors-lib.sc_common") +local sc_logger = require("centreon-stream-connectors-lib.sc_logger") +local sc_broker = require("centreon-stream-connectors-lib.sc_broker") +local sc_event = require("centreon-stream-connectors-lib.sc_event") +local sc_params = require("centreon-stream-connectors-lib.sc_params") +local sc_macros = require("centreon-stream-connectors-lib.sc_macros") +local sc_flush = require("centreon-stream-connectors-lib.sc_flush") +local sc_metrics = require("centreon-stream-connectors-lib.sc_metrics") +local sc_storage = require("centreon-stream-connectors-lib.sc_storage") + +-------------------------------------------------------------------------------- +-- Classe event_queue +-------------------------------------------------------------------------------- + +local EventQueue = {} +EventQueue.__index = EventQueue + +local scope_name = "opentelemetry-otelhttp-json-metrics-apiv2.lua" +local scope_version = "1.0.0" + +-------------------------------------------------------------------------------- +---- Constructor +---- @param conf The table given by the init() function and returned from the GUI +---- @return the new EventQueue +---------------------------------------------------------------------------------- + +function EventQueue.new(params) + local self = {} + + local mandatory_parameters = { + "endpoint" + } + + self.fail = false + + -- set up log configuration + local logfile = params.logfile or "/var/log/centreon-broker/opentelemetry-otelhttp-json-metrics.log" + local log_level = params.log_level or 1 + + -- initiate mandatory objects + self.sc_logger = sc_logger.new(logfile, log_level) + self.sc_common = sc_common.new(self.sc_logger) + self.sc_broker = sc_broker.new(self.sc_logger) + self.sc_params = sc_params.new(self.sc_common, self.sc_logger) + + -- checking mandatory parameters and setting a fail flag + if not self.sc_params:is_mandatory_config_set(mandatory_parameters, params) then + self.fail = true + end + + --params.max_buffer_size = 1 + + -- overriding default parameters for this stream connector if the default values doesn't suit the basic needs + self.sc_params.params.endpoint = params.endpoint + self.sc_params.params.endpoint_uri = params.endpoint_uri or "/v1/metrics" + self.sc_params.params.accepted_categories = params.accepted_categories or "neb" + self.sc_params.params.accepted_elements = params.accepted_elements or "service_status" + self.sc_params.params.max_buffer_size = params.max_buffer_size or 30 + self.sc_params.params.max_all_queues_age = params.max_all_queues_age or 10 + self.sc_params.params.hard_only = params.hard_only or 0 + self.sc_params.params.send_mixed_events = params.send_mixed_events or 1 + self.sc_params.params.enable_host_status_dedup = params.enable_host_status_dedup or 0 + self.sc_params.params.enable_service_status_dedup = params.enable_service_status_dedup or 0 + self.sc_params.params.metric_name_regex = params.metric_name_regex or "[^a-zA-Z0-9_%.]" + self.sc_params.params.metric_replacement_character = params.metric_replacement_character or "_" + + -- apply users params and check syntax of standard ones + self.sc_params:param_override(params) + self.sc_params:check_params() + self.sc_macros = sc_macros.new(self.sc_params.params, self.sc_logger) + + -- only load the custom code file, not executed yet + if self.sc_params.load_custom_code_file and not self.sc_params:load_custom_code_file(self.sc_params.params.custom_code_file) then + self.sc_logger:error("[EventQueue:new]: couldn't successfully load the custom code file: " .. tostring(self.sc_params.params.custom_code_file)) + end + + self.sc_params:build_accepted_elements_info() + self.sc_flush = sc_flush.new(self.sc_params.params, self.sc_logger) + self.sc_storage = sc_storage.new(self.sc_common, self.sc_logger, self.sc_params.params) + + local categories = self.sc_params.params.bbdo.categories + local elements = self.sc_params.params.bbdo.elements + + self.format_event = { + [categories.neb.id] = { + [elements.host_status.id] = function () return self:format_event_host() end, + [elements.service_status.id] = function () return self:format_event_service() end + } + } + + self.format_metric = { + [categories.neb.id] = { + [elements.host_status.id] = function (metric) return self:format_metric_host(metric) end, + [elements.service_status.id] = function (metric) return self:format_metric_service(metric) end + } + } + + self.send_data_method = { + [1] = function (payload, queue_metadata) return self:send_data(payload, queue_metadata) end + } + + self.build_payload_method = { + [1] = function (payload, event) return self:build_payload(payload, event) end + } + + -- return EventQueue object + setmetatable(self, { __index = EventQueue }) + return self +end + +-------------------------------------------------------------------------------- +---- EventQueue:format_accepted_event method +-------------------------------------------------------------------------------- +function EventQueue:format_accepted_event() + local category = self.sc_event.event.category + local element = self.sc_event.event.element + + self.sc_logger:debug("[EventQueue:format_event]: starting format event") + + -- can't format event if stream connector is not handling this kind of event and that it is not handled with a template file + if not self.format_event[category][element] then + self.sc_logger:error("[format_event]: You are trying to format an event with category: " + .. tostring(self.sc_params.params.reverse_category_mapping[category]) .. " and element: " + .. tostring(self.sc_params.params.reverse_element_mapping[category][element]) + .. ". If it is a not a misconfiguration, you should create a format file to handle this kind of element") + else + self.format_event[category][element]() + end + + self.sc_logger:debug("[EventQueue:format_event]: event formatting is finished") +end + +-------------------------------------------------------------------------------- +---- EventQueue:format_event_host method +-------------------------------------------------------------------------------- +function EventQueue:format_event_host() + local event = self.sc_event.event + self.sc_logger:debug("[EventQueue:format_event_host]: call build_metric ") + self.sc_metrics:build_metric(self.format_metric[event.category][event.element]) +end + +-------------------------------------------------------------------------------- +---- EventQueue:format_event_service method +-------------------------------------------------------------------------------- +function EventQueue:format_event_service() + self.sc_logger:debug("[EventQueue:format_event_service]: call build_metric ") + local event = self.sc_event.event + self.sc_metrics:build_metric(self.format_metric[event.category][event.element]) +end + +-------------------------------------------------------------------------------- +---- EventQueue:format_metric_host method +-- @param metric {table} a single metric data +-------------------------------------------------------------------------------- +function EventQueue:format_metric_host(metric) + self.sc_logger:debug("[EventQueue:format_metric_host]: call format_metric ") + self:format_metric_event(metric) +end + +-------------------------------------------------------------------------------- +---- EventQueue:format_metric_service method +-- @param metric {table} a single metric data +-------------------------------------------------------------------------------- +function EventQueue:format_metric_service(metric) + self.sc_logger:debug("[EventQueue:format_metric_service]: call format_metric ") + self:format_metric_event(metric) +end + +-------------------------------------------------------------------------------- +---- EventQueue:format_metric_service method +-- @param metric {table} a single metric data +-------------------------------------------------------------------------------- +function EventQueue:format_metric_event(metric) + self.sc_logger:debug("[EventQueue:format_metric]: start real format metric ") + local event = self.sc_event.event + self.sc_event.event.formated_event = { + host = tostring(event.cache.host.name), + metric = metric.metric_name, + point = { + asDouble = metric.value, + timeUnixNano = event.last_check .. "000000000" + } + } + + self:add() +end + +-------------------------------------------------------------------------------- +-- EventQueue:add, add an event to the sending queue +-------------------------------------------------------------------------------- +function EventQueue:add() + -- store event in self.events lists + local category = self.sc_event.event.category + local element = self.sc_event.event.element + + self.sc_logger:debug("[EventQueue:add]: add event in queue category: " .. tostring(self.sc_params.params.reverse_category_mapping[category]) + .. " element: " .. tostring(self.sc_params.params.reverse_element_mapping[category][element])) + + self.sc_logger:debug("[EventQueue:add]: queue size before adding event: " .. tostring(#self.sc_flush.queues[category][element].events)) + self.sc_flush.queues[category][element].events[#self.sc_flush.queues[category][element].events + 1] = self.sc_event.event.formated_event + + self.sc_logger:info("[EventQueue:add]: queue size is now: " .. tostring(#self.sc_flush.queues[category][element].events) + .. ", max is: " .. tostring(self.sc_params.params.max_buffer_size)) +end + +-------------------------------------------------------------------------------- +---- EventQueue:build_resource_attributes method +-- @param host {string} hostname string used as a resource attribute +-- @return attributes {table} a table representing the resource attributes +-- See https://opentelemetry.io/docs/specs/otel/overview/#resources +-------------------------------------------------------------------------------- +function EventQueue:build_resource_attributes(host) + local attributes = {} + + table.insert(attributes, + { + key = "host.name", + value = { + stringValue = host + } + } + ) + + return attributes +end + +-------------------------------------------------------------------------------- +---- EventQueue:build_scopemetrics method +-- @return scopemetrics {table} a table representing the scopemetrics entry +-- See https://opentelemetry.io/docs/specs/otel/common/instrumentation-scope/ +-------------------------------------------------------------------------------- +function EventQueue:build_scopemetrics() + local scopemetrics = {} + + table.insert(scopemetrics, { + scope = { + name = scope_name, + version = scope_version + }, + metrics = {} + } + ) + + return scopemetrics +end + +-------------------------------------------------------------------------------- +---- EventQueue:build_metrics method +-- @param metric {string} metric name +-- @param point {table} table of data points +-- @return metrics {table} a table representing a metric entry +-- See https://opentelemetry.io/docs/specs/otel/metrics/data-model/#opentelemetry-protocol-data-model +-------------------------------------------------------------------------------- +function EventQueue:build_metrics(metric, point) + local metrics = {} + + metrics = { + name = metric, + gauge = { + dataPoints = {} + } + } + + table.insert(metrics.gauge.dataPoints, point) + + return metrics +end + +-------------------------------------------------------------------------------- +-- EventQueue:build_payload, concatenate data so it is ready to be sent +-- @param payload {string} payload lua object +-- @param event {table} the event that is going to be added to the payload +-- @return payload {string} payload lua object +-- See https://github.com/open-telemetry/opentelemetry-proto/tree/main/examples for example +-------------------------------------------------------------------------------- +function EventQueue:build_payload(payload, event) + self.sc_logger:debug("[EventQueue:build_payload]: Loading event:") + self.sc_logger:debug("[EventQueue:build_payload]: host: " .. event.host) + self.sc_logger:debug("[EventQueue:build_payload]: metric: " .. event.metric) + self.sc_logger:debug("[EventQueue:build_payload]: point value: " .. event.point.asDouble) + self.sc_logger:debug("[EventQueue:build_payload]: point time: " .. event.point.timeUnixNano) + + if not payload or self.indexes[event.host] == nil or self.indexes[event.host] == "" then + self.sc_logger:debug("[EventQueue:build_payload]: Creating resource entry for host " .. event.host .. " and metric " .. event.metric) + if not payload then + self.indexes = {} + + payload = { + resourceMetrics = {} + } + end + + local resource_metric = {} + resource_metric = { + resource = { + attributes = self:build_resource_attributes(event.host) + }, + scopeMetrics = self:build_scopemetrics() + } + + table.insert(resource_metric.scopeMetrics[1].metrics, self:build_metrics(event.metric, event.point)) + table.insert(payload.resourceMetrics, resource_metric) + + self.indexes[event.host] = {} + self.indexes[event.host] = { + index = (#payload.resourceMetrics), + [event.metric] = 1 + } + elseif self.indexes[event.host][event.metric] == nil or self.indexes[event.host][event.metric] == "" then + self.sc_logger:debug("[EventQueue:build_payload]: Reusing resource entry for host " .. event.host .. " and creating metric " .. event.metric) + table.insert(payload.resourceMetrics[self.indexes[event.host].index].scopeMetrics[1].metrics, self:build_metrics(event.metric, event.point)) + self.indexes[event.host][event.metric] = (#payload.resourceMetrics[self.indexes[event.host].index].scopeMetrics[1].metrics) + else + self.sc_logger:debug("[EventQueue:build_payload]: Adding data points for host " .. event.host .. " and metric " .. event.metric) + table.insert(payload.resourceMetrics[self.indexes[event.host].index].scopeMetrics[1].metrics[self.indexes[event.host][event.metric]].gauge.dataPoints, event.point) + end + + return payload +end + +function EventQueue:send_data(payload, queue_metadata) + self.sc_logger:debug("[EventQueue:send_data]: Starting to send data") + + local url = self.sc_params.params.endpoint .. tostring(self.sc_params.params.endpoint_uri) + local payload_json = broker.json_encode(payload) + queue_metadata.headers = { + "Content-Type: application/json" + } + + self.sc_logger:log_curl_command(url, queue_metadata, self.sc_params.params, payload_json) + + -- write payload in the logfile for test purpose + if self.sc_params.params.send_data_test == 1 then + self.sc_logger:notice("[send_data]: " .. tostring(payload_json)) + return true + end + + self.sc_logger:info("[EventQueue:send_data]: Going to send the following json " .. tostring(payload_json)) + self.sc_logger:info("[EventQueue:send_data]: OpenTelemetry endpoint is: " .. tostring(url)) + + local http_response_body = "" + local http_request = curl.easy() + :setopt_url(url) + :setopt_writefunction( + function (response) + http_response_body = http_response_body .. tostring(response) + end + ) + :setopt(curl.OPT_TIMEOUT, self.sc_params.params.connection_timeout) + :setopt(curl.OPT_SSL_VERIFYPEER, self.sc_params.params.verify_certificate) + :setopt(curl.OPT_HTTPHEADER, queue_metadata.headers) + + -- set proxy address configuration + if (self.sc_params.params.proxy_address ~= '') then + if (self.sc_params.params.proxy_port ~= '') then + http_request:setopt(curl.OPT_PROXY, self.sc_params.params.proxy_address .. ':' .. self.sc_params.params.proxy_port) + else + self.sc_logger:error("[EventQueue:send_data]: proxy_port parameter is not set but proxy_address is used") + end + end + + -- set proxy user configuration + if (self.sc_params.params.proxy_username ~= '') then + if (self.sc_params.params.proxy_password ~= '') then + http_request:setopt(curl.OPT_PROXYUSERPWD, self.sc_params.params.proxy_username .. ':' .. self.sc_params.params.proxy_password) + else + self.sc_logger:error("[EventQueue:send_data]: proxy_password parameter is not set but proxy_username is used") + end + end + + -- adding the HTTP POST data + http_request:setopt_postfields(payload_json) + + -- performing the HTTP request + http_request:perform() + + -- collecting results + http_response_code = http_request:getinfo(curl.INFO_RESPONSE_CODE) + + http_request:close() + + -- Handling the return code + local retval = false + -- + if http_response_code == 200 then + self.sc_logger:info("[EventQueue:send_data]: HTTP POST request successful: return code is " .. tostring(http_response_code)) + retval = true + else + self.sc_logger:error("[EventQueue:send_data]: HTTP POST request FAILED, return code is " .. tostring(http_response_code) .. ". Message is: " .. tostring(http_response_body)) + + if payload then + self.sc_logger:error("[EventQueue:send_data]: sent payload was: " .. tostring(payload)) + end + end + + return retval +end + +-------------------------------------------------------------------------------- +-- Required functions for Broker StreamConnector +-------------------------------------------------------------------------------- + +local queue + +-- Fonction init() +function init(conf) + queue = EventQueue.new(conf) +end + +-- -------------------------------------------------------------------------------- +-- write, +-- @param {table} event, the event from broker +-- @return {boolean} +-------------------------------------------------------------------------------- +function write (event) + -- skip event if a mandatory parameter is missing + if queue.fail then + queue.sc_logger:error("Skipping event because a mandatory parameter is not set") + return false + end + + -- initiate event object + queue.sc_metrics = sc_metrics.new(event, queue.sc_params.params, queue.sc_common, queue.sc_broker, queue.sc_storage, queue.sc_logger) + queue.sc_event = queue.sc_metrics.sc_event + + if queue.sc_event:is_valid_category() then + if queue.sc_metrics:is_valid_bbdo_element() then + -- format event if it is validated + if queue.sc_metrics:is_valid_metric_event() then + queue:format_accepted_event() + end + --- log why the event has been dropped + else + queue.sc_logger:debug("dropping event because element is not valid. Event element is: " + .. tostring(queue.sc_params.params.reverse_element_mapping[queue.sc_event.event.category][queue.sc_event.event.element])) + end + else + queue.sc_logger:debug("dropping event because category is not valid. Event category is: " + .. tostring(queue.sc_params.params.reverse_category_mapping[queue.sc_event.event.category])) + end + + return flush() +end + + +-- flush method is called by broker every now and then (more often when broker has nothing else to do) +function flush() + local queues_size = queue.sc_flush:get_queues_size() + + -- nothing to flush + if queues_size == 0 then + return true + end + + -- flush all queues because last global flush is too old + if queue.sc_flush.last_global_flush < os.time() - queue.sc_params.params.max_all_queues_age then + if not queue.sc_flush:flush_all_queues(queue.build_payload_method[1], queue.send_data_method[1]) then + return false + end + + return true + end + + -- flush queues because too many events are stored in them + if queues_size > queue.sc_params.params.max_buffer_size then + if not queue.sc_flush:flush_all_queues(queue.build_payload_method[1], queue.send_data_method[1]) then + return false + end + + return true + end + + -- there are events in the queue but they were not ready to be send + return false +end From a1b8c84ab9a2c6e95d6759695c342d2c09884358 Mon Sep 17 00:00:00 2001 From: Boris Libert <52497235+Nivoky@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:08:14 +0200 Subject: [PATCH 8/9] ci(packaging): enable el10 and deb13 for the lib (#377) --- .github/actions/test-packages/action.yml | 9 ++++--- .github/workflows/stream-connectors-lib.yml | 30 ++++++++++----------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/.github/actions/test-packages/action.yml b/.github/actions/test-packages/action.yml index 10ca4bab..8cde19f9 100644 --- a/.github/actions/test-packages/action.yml +++ b/.github/actions/test-packages/action.yml @@ -35,7 +35,7 @@ runs: if [[ "$DISTRIB" == "el8" || "$DISTRIB" == "el9" ]]; then CENTREON_VERSION="25.10" else - CENTREON_VERSION="26.10" # el10 - repo not yet available + CENTREON_VERSION="26.10" # el10 fi # Add Centreon plugins and standard repositories cat > /etc/yum.repos.d/centreon-plugins.repo << EOF @@ -193,7 +193,7 @@ runs: new_repo_format=true elif [[ "$DISTRIB" == "trixie" ]]; then standard_base="apt-standard" - standard_distrib="${DISTRIB}-26.10" # repo not yet available + standard_distrib="${DISTRIB}-26.10" plugins_prefix="apt-plugins" new_repo_format=true fi @@ -204,7 +204,10 @@ runs: echo "deb https://packages.centreon.com/${standard_base}/ ${standard_distrib}-stable main" | tee /etc/apt/sources.list.d/centreon-standard.list fi if [[ "$use_standard_testing" == "true" ]]; then - echo "deb https://packages.centreon.com/${standard_base}/ ${standard_distrib}-testing main" | tee -a /etc/apt/sources.list.d/centreon-standard.list + # The new repo format splits testing into release and hotfix suites, like the rpm one. + # The aggregated "-testing" suite only exists for bookworm and is not published for trixie. + echo "deb https://packages.centreon.com/${standard_base}/ ${standard_distrib}-testing-release main" | tee -a /etc/apt/sources.list.d/centreon-standard.list + echo "deb https://packages.centreon.com/${standard_base}/ ${standard_distrib}-testing-hotfix main" | tee -a /etc/apt/sources.list.d/centreon-standard.list fi if [[ "$use_standard_unstable" == "true" ]]; then echo "deb https://packages.centreon.com/${standard_base}/ ${standard_distrib}-unstable main" | tee -a /etc/apt/sources.list.d/centreon-standard.list diff --git a/.github/workflows/stream-connectors-lib.yml b/.github/workflows/stream-connectors-lib.yml index 826b5b61..b288d4b8 100644 --- a/.github/workflows/stream-connectors-lib.yml +++ b/.github/workflows/stream-connectors-lib.yml @@ -34,7 +34,7 @@ jobs: strategy: fail-fast: false matrix: - distrib: [el8, el9, bullseye, bookworm, jammy, noble] #, el10, trixie] + distrib: [el8, el9, el10, bullseye, bookworm, trixie, jammy, noble] include: - package_extension: rpm image: packaging-stream-connectors-nfpm-alma8 @@ -42,18 +42,18 @@ jobs: - package_extension: rpm image: packaging-stream-connectors-nfpm-alma9 distrib: el9 -# - package_extension: rpm -# image: packaging-stream-connectors-nfpm-alma10 -# distrib: el10 + - package_extension: rpm + image: packaging-stream-connectors-nfpm-alma10 + distrib: el10 - package_extension: deb image: packaging-stream-connectors-nfpm-bullseye distrib: bullseye - package_extension: deb image: packaging-stream-connectors-nfpm-bookworm distrib: bookworm -# - package_extension: deb -# image: packaging-stream-connectors-nfpm-trixie -# distrib: trixie + - package_extension: deb + image: packaging-stream-connectors-nfpm-trixie + distrib: trixie - package_extension: deb image: packaging-stream-connectors-nfpm-jammy distrib: jammy @@ -104,18 +104,18 @@ jobs: - package_extension: rpm image: almalinux:9 distrib: el9 -# - package_extension: rpm # Centreon 26.10 repo not yet available -# image: almalinux:10 -# distrib: el10 + - package_extension: rpm + image: almalinux:10 + distrib: el10 - package_extension: deb image: debian:bullseye distrib: bullseye - package_extension: deb image: debian:bookworm distrib: bookworm -# - package_extension: deb # Centreon 26.10 repo not yet available -# image: debian:trixie -# distrib: trixie + - package_extension: deb + image: debian:trixie + distrib: trixie - package_extension: deb image: ubuntu:jammy distrib: jammy @@ -150,7 +150,7 @@ jobs: runs-on: ubuntu-24.04 strategy: matrix: - distrib: [el8, el9] #, el10] + distrib: [el8, el9, el10] name: deliver ${{ matrix.distrib }} steps: @@ -172,7 +172,7 @@ jobs: runs-on: ubuntu-24.04 strategy: matrix: - distrib: [bullseye, bookworm, jammy, noble] #, trixie] + distrib: [bullseye, bookworm, trixie, jammy, noble] name: deliver ${{ matrix.distrib }} steps: From dd0aeb970d792884b02842699491313adddb5963 Mon Sep 17 00:00:00 2001 From: Boris Libert <52497235+Nivoky@users.noreply.github.com> Date: Tue, 11 Aug 2026 11:41:54 +0200 Subject: [PATCH 9/9] ci(packaging): enable el10 and deb13 for connectors (#376) --- .github/workflows/stream-connectors.yml | 50 ++++++++++++++----------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/.github/workflows/stream-connectors.yml b/.github/workflows/stream-connectors.yml index f4d42612..7e37653b 100644 --- a/.github/workflows/stream-connectors.yml +++ b/.github/workflows/stream-connectors.yml @@ -77,7 +77,7 @@ jobs: strategy: max-parallel: 25 matrix: - distrib: [el8, el9, bullseye, bookworm, jammy, noble] # ,el10, trixie] + distrib: [el8, el9, el10, bullseye, bookworm, trixie, jammy, noble] connector_path: ${{ fromJson(needs.detect-changes.outputs.connectors) }} include: - distrib: el8 @@ -86,18 +86,18 @@ jobs: - distrib: el9 image: packaging-stream-connectors-nfpm-alma9 package_extension: rpm -# - distrib: el10 -# image: packaging-stream-connectors-nfpm-alma10 -# package_extension: rpm + - distrib: el10 + image: packaging-stream-connectors-nfpm-alma10 + package_extension: rpm - distrib: bullseye image: packaging-stream-connectors-nfpm-bullseye package_extension: deb - distrib: bookworm image: packaging-stream-connectors-nfpm-bookworm package_extension: deb -# - distrib: trixie -# image: packaging-stream-connectors-nfpm-trixie -# package_extension: deb + - distrib: trixie + image: packaging-stream-connectors-nfpm-trixie + package_extension: deb - distrib: jammy image: packaging-stream-connectors-nfpm-jammy package_extension: deb @@ -130,26 +130,34 @@ jobs: - name: Add specific dependencies env: CONNECTOR_PATH: ${{ matrix.connector_path }} + DISTRIB: ${{ matrix.distrib }} run: | - DEB_DEPENDENCIES="libcurl4" + # Debian renamed libcurl4 to libcurl4t64 with the 64-bit time_t transition, + # and provides no libcurl4 virtual package from trixie onwards. + if [ "$DISTRIB" = "trixie" ]; then + DEB_CURL="libcurl4t64" + else + DEB_CURL="libcurl4" + fi + DEB_DEPENDENCIES="$DEB_CURL" RPM_DEPENDENCIES="libcurl" if [ "$CONNECTOR_PATH" = "elastic" ]; then DEB_DEPENDENCIES="lua-sec" RPM_DEPENDENCIES="lua-sec" elif [ "$CONNECTOR_PATH" = "influxdb" ]; then - DEB_DEPENDENCIES="libcurl4,lua-sec" + DEB_DEPENDENCIES="$DEB_CURL,lua-sec" RPM_DEPENDENCIES="libcurl,lua-sec" elif [ "$CONNECTOR_PATH" = "google" ]; then - DEB_DEPENDENCIES="libcurl4,lua-openssl" + DEB_DEPENDENCIES="$DEB_CURL,lua-openssl" RPM_DEPENDENCIES="libcurl,lua-openssl" elif [ "$CONNECTOR_PATH" = "kafka" ]; then DEB_DEPENDENCIES="librdkafka1,lua-cffi" RPM_DEPENDENCIES="librdkafka,lua-cffi" elif [ "$CONNECTOR_PATH" = "pagerduty" ]; then - DEB_DEPENDENCIES="libcurl4,lua-tz" + DEB_DEPENDENCIES="$DEB_CURL,lua-tz" RPM_DEPENDENCIES="libcurl,lua-tz" elif [ "$CONNECTOR_PATH" = "splunk" ]; then - DEB_DEPENDENCIES="libcurl4,lua-tz" + DEB_DEPENDENCIES="$DEB_CURL,lua-tz" RPM_DEPENDENCIES="libcurl,lua-tz" fi sed -i "s/@RPM_DEPENDENCIES@/$RPM_DEPENDENCIES/g;" ./packaging/connectors/centreon-stream-connectors.yaml @@ -184,7 +192,7 @@ jobs: fail-fast: false max-parallel: 25 matrix: - distrib: [el8, el9, bullseye, bookworm, jammy, noble] #, el10, trixie] + distrib: [el8, el9, el10, bullseye, bookworm, trixie, jammy, noble] connector_path: ${{ fromJson(needs.detect-changes.outputs.connectors) }} include: - distrib: el8 @@ -193,18 +201,18 @@ jobs: - distrib: el9 package_extension: rpm image: almalinux:9 -# - distrib: el10 # Centreon 26.10 repo not yet available -# package_extension: rpm -# image: almalinux:10 + - distrib: el10 + package_extension: rpm + image: almalinux:10 - distrib: bullseye package_extension: deb image: debian:bullseye - distrib: bookworm package_extension: deb image: debian:bookworm -# - distrib: trixie # Centreon 26.10 repo not yet available -# package_extension: deb -# image: debian:trixie + - distrib: trixie + package_extension: deb + image: debian:trixie - distrib: jammy package_extension: deb image: ubuntu:jammy @@ -239,7 +247,7 @@ jobs: runs-on: ubuntu-24.04 strategy: matrix: - distrib: [el8, el9] #, el10] + distrib: [el8, el9, el10] connector_path: ${{ fromJson(needs.detect-changes.outputs.connectors) }} name: Deliver ${{ matrix.distrib }} ${{ matrix.connector_path }} @@ -262,7 +270,7 @@ jobs: runs-on: ubuntu-24.04 strategy: matrix: - distrib: [bullseye, bookworm, jammy, noble] #, trixie] + distrib: [bullseye, bookworm, trixie, jammy, noble] connector_path: ${{ fromJson(needs.detect-changes.outputs.connectors) }} name: Deliver ${{ matrix.distrib }} ${{ matrix.connector_path }}