Repository: kubernetes-sigs/security-profiles-operator
Pull request #1215 (2022-10-10 23:09:22)

build(deps): bump github.com/aquasecurity/libbpfgo from 0.4.0-libbpf-1.0.0 to 0.4.1-libbpf-1.0.0
Bumps [github.com/aquasecurity/libbpfgo](https://github.com/aquasecurity/libbpfgo) from 0.4.0-libbpf-1.0.0 to 0.4.1-libbpf-1.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/aquasecurity/libbpfgo/releases">github.com/aquasecurity/libbpfgo's releases</a>.</em></p>
<blockquote>
<h1>v0.4.1-libbpf-1.0.0</h1>
<p><strong><em>This release of libbpfgo is meant to used with libbpf v1.0.0</em></strong></p>
<h2>Breaking Changes</h2>
<ul>
<li>The package <code>github.com/aquasecurity/libbpfgo/helpers</code> is now contained in its own module. You can now upgrade it as a dependency independently of libbpfgo.
You may run into errors when running <code>go mod tidy</code> that can be fixed by clearing your go cache or explicitly <code>go get</code>ing the latest version of it.
<ul>
<li>Each release will cut new releases of both the helpers and libbpfgo module, but upgrading one does not require you to upgrade the other.</li>
</ul>
</li>
</ul>
<h2>New features</h2>
<ul>
<li>Introduced a vagrantfile for running tests in a working VM environment (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/237">#237</a>)</li>
</ul>
<h2>Improvements/Fixes</h2>
<ul>
<li>The value of errno is now properly saved before calls to printf (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/256">#256</a> - Thanks <a href="https://github.com/mozillazg"><code>@​mozillazg</code></a>)</li>
<li>CGO code is now in its own header file (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/257">#257</a> - Thanks <a href="https://github.com/mozillazg"><code>@​mozillazg</code></a>!)</li>
<li>Fixed an issue with how cgo handled bitmap padding optimizations in libbpf (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/246">#246</a>)</li>
<li>Optimized retrieving kernel symbols from symbol table, now caches by address and name (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/241">#241</a>)</li>
</ul>
<h3>Full Changelog</h3>
<p>76c5ff4 - remove defunct tests (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/259">#259</a>) (grantseltzer)
3c30919 - Move embedded C code to a header file (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/257">#257</a>) (Huang Huang)
9eb6002 - Helpers in its own mod followup (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/255">#255</a>) (grantseltzer)
b398b6e - Save the value of errno before calling printf in cgo code (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/256">#256</a>) (Huang Huang)
7139cb4 - Make helpers package it's own module (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/246">#246</a>) (grantseltzer)
a8b06c3 - c: stdarg: move references to commit, add a note (Geyslan Gregório)
245a1a1 - Update libbpfgo.go (Geyslan Gregório)
7c90aa9 - Fix undefined behaviour in variadic argument handling (Francisco Javier Honduvilla Coto)
14c6bc9 - Move logic into C code via cgo (rotscale)
c93e66f - kernel_symbols: cache symbols by addr (Nadav Strahilevitz)
bd31ff0 - builder: vagrant: introduce Vagrantfile (Geyslan Gregório)
33d4c0d - makefile: fix vmlinuxh rule (Geyslan Gregório)
b5b0a6e - helpers: remove debugging leftover (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/236">#236</a>) (Rafael David Tinoco)
45a1acd - fix Makefiles typos (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/235">#235</a>) (Geyslan Gregório)
0f69086 - Clarify code in comments and var names (grantseltzer)
7d0ebda - Quick fix to logic in helpers (grantseltzer)</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/76c5ff434a35f51c4f1b8d81c5456442bef607ef"><code>76c5ff4</code></a> remove defunct tests (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/259">#259</a>)</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/3c30919c0d998564c7bb82f21d9344e6fa865685"><code>3c30919</code></a> Move embedded C code to a header file (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/257">#257</a>)</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/9eb6002d9e3d6c161004a121f76f358ec5be0c77"><code>9eb6002</code></a> Helpers in its own mod followup (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/255">#255</a>)</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/b398b6ef23cb499127500bcc693b702293bbf88a"><code>b398b6e</code></a> Save the value of errno before calling printf in cgo code (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/256">#256</a>)</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/7139cb41036f324e528670d3904d478b419501d9"><code>7139cb4</code></a> Make helpers package it's own module (<a href="https://github-redirect.dependabot.com/aquasecurity/libbpfgo/issues/246">#246</a>)</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/a8b06c38a89da0520b98e9fed849e5c1d6eb43a3"><code>a8b06c3</code></a> c: stdarg: move references to commit, add a note</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/245a1a13132ec0afc4a1d0f53b9317464980bcb6"><code>245a1a1</code></a> Update libbpfgo.go</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/7c90aa953b722abeac8bac2400481614f7a76fc1"><code>7c90aa9</code></a> Fix undefined behaviour in variadic argument handling</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/14c6bc9b8a05d76cb038add3df36a75b45372c86"><code>14c6bc9</code></a> Move logic into C code via cgo</li>
<li><a href="https://github.com/aquasecurity/libbpfgo/commit/c93e66fb053daf15427ee99072d43640a7790c19"><code>c93e66f</code></a> kernel_symbols: cache symbols by addr</li>
<li>Additional commits viewable in <a href="https://github.com/aquasecurity/libbpfgo/compare/v0.4.0-libbpf-1.0.0...v0.4.1-libbpf-1.0.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aquasecurity/libbpfgo&package-manager=go_modules&previous-version=0.4.0-libbpf-1.0.0&new-version=0.4.1-libbpf-1.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

k8s-ci-robot: Hi @dependabot[bot]. Thanks for your PR.

I'm waiting for a [kubernetes-sigs](https://github.com/orgs/kubernetes-sigs/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://git.k8s.io/community/community-membership.md#member) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fsecurity-profiles-operator).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/security-profiles-operator/pull/1215#" title="Author self-approved">dependabot[bot]</a>*
**Once this PR has been reviewed and has the lgtm label**, please assign pjbgf for approval by writing `/assign @pjbgf` in a comment. For more information see:[The Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fsecurity-profiles-operator).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/security-profiles-operator/blob/main/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["pjbgf"]} -->
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/security-profiles-operator/pull/1215#" title="Author self-approved">dependabot[bot]</a>*, *<a href="https://github.com/kubernetes-sigs/security-profiles-operator/pull/1215#pullrequestreview-1136769535" title="LGTM">JAORMX</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fsecurity-profiles-operator).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/kubernetes-sigs/security-profiles-operator/blob/main/OWNERS)~~ [JAORMX]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
JAORMX: /lgtm cancel
JAORMX: rerunning the fedora tests

Patch:
diff --git a/go.mod b/go.mod
index 8cc4ecfa7..eb06755db 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,7 @@ go 1.19
 
 require (
 	github.com/acobaugh/osrelease v0.0.0-20181218015638-a93a0a55a249
-	github.com/aquasecurity/libbpfgo v0.4.0-libbpf-1.0.0
+	github.com/aquasecurity/libbpfgo v0.4.1-libbpf-1.0.0
 	github.com/blang/semver/v4 v4.0.0
 	github.com/cert-manager/cert-manager v1.9.1
 	github.com/containers/common v0.48.1-0.20220510094751-400832f41771
@@ -21,7 +21,7 @@ require (
 	github.com/prometheus/client_model v0.2.0
 	github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921
 	github.com/stretchr/testify v1.8.0
-	github.com/urfave/cli/v2 v2.17.1
+	github.com/urfave/cli/v2 v2.19.2
 	golang.org/x/net v0.0.0-20220909164309-bea034e7d591
 	golang.org/x/sync v0.0.0-20220907140024-f12130a52804
 	google.golang.org/grpc v1.50.0
diff --git a/go.sum b/go.sum
index c843b00a0..b454d7cd4 100644
--- a/go.sum
+++ b/go.sum
@@ -152,8 +152,8 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU
 github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ=
-github.com/aquasecurity/libbpfgo v0.4.0-libbpf-1.0.0 h1:WHKqRRCVhEI5CG/2gqKhTZ494QeriVe/cuQrpkHzTAk=
-github.com/aquasecurity/libbpfgo v0.4.0-libbpf-1.0.0/go.mod h1:qu0TVGRvtNMFkuKLscJkY1FwmageNBLqeImAFslqPPc=
+github.com/aquasecurity/libbpfgo v0.4.1-libbpf-1.0.0 h1:GDltac31CrXY6OP9cUfE3asQKumv9+xUMeYRIa/5fUc=
+github.com/aquasecurity/libbpfgo v0.4.1-libbpf-1.0.0/go.mod h1:v+Nk+v6BtHLfdT4kVdsp+fYt4AeUa3cIG2P0y+nBuuY=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
@@ -1353,8 +1353,8 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
 github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
-github.com/urfave/cli/v2 v2.17.1 h1:UzjDEw2dJQUE3iRaiNQ1VrVFbyAtKGH3VdkMoHA58V0=
-github.com/urfave/cli/v2 v2.17.1/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI=
+github.com/urfave/cli/v2 v2.19.2 h1:eXu5089gqqiDQKSnFW+H/FhjrxRGztwSxlTsVK7IuqQ=
+github.com/urfave/cli/v2 v2.19.2/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI=
 github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
diff --git a/vendor/github.com/aquasecurity/libbpfgo/.gitignore b/vendor/github.com/aquasecurity/libbpfgo/.gitignore
index b926c2c89..e2e03e39d 100644
--- a/vendor/github.com/aquasecurity/libbpfgo/.gitignore
+++ b/vendor/github.com/aquasecurity/libbpfgo/.gitignore
@@ -5,4 +5,5 @@ selftest/*/*-static
 selftest/*/*-dynamic
 selftest/uprobe/ctest
 selftest/uprobe/gotest
-testing/tracee
\ No newline at end of file
+testing/tracee
+.vagrant*
diff --git a/vendor/github.com/aquasecurity/libbpfgo/Makefile b/vendor/github.com/aquasecurity/libbpfgo/Makefile
index 95e620552..1942dd295 100644
--- a/vendor/github.com/aquasecurity/libbpfgo/Makefile
+++ b/vendor/github.com/aquasecurity/libbpfgo/Makefile
@@ -1,3 +1,7 @@
+
+.ONESHELL:
+SHELL = /bin/bash
+
 BASEDIR = $(abspath ./)
 
 OUTPUT = ./output
@@ -7,8 +11,11 @@ HELPERS = ./helpers
 CC = gcc
 CLANG = clang
 GO = go
+VAGRANT = vagrant
+CLANG_FMT = clang-format
 
-ARCH := $(shell uname -m | sed 's/x86_64/amd64/g; s/aarch64/arm64/g')
+HOSTOS = $(shell uname)
+ARCH ?= $(shell uname -m | sed 's/x86_64/amd64/g; s/aarch64/arm64/g')
 
 BTFFILE = /sys/kernel/btf/vmlinux
 BPFTOOL = $(shell which bpftool || /bin/false)
@@ -31,7 +38,7 @@ CGO_CFLAGS_STATIC = "-I$(abspath $(OUTPUT))"
 CGO_LDFLAGS_STATIC = "-lelf -lz $(LIBBPF_OBJ)"
 CGO_EXTLDFLAGS_STATIC = '-w -extldflags "-static"'
 
-CGO_CFGLAGS_DYN = "-I. -I/usr/include/"
+CGO_CFLAGS_DYN = "-I. -I/usr/include/"
 CGO_LDFLAGS_DYN = "-lelf -lz -lbpf"
 
 # default == shared lib from OS package
@@ -95,14 +102,17 @@ $(VMLINUXH): $(OUTPUT)
 		echo "ERROR: kernel does not seem to support BTF"; \
 		exit 1; \
 	fi
-	@if [ ! -f $(VMLINUXH) ]; then \
-		if [ ! $(BPFTOOL) ]; then \
-			echo "ERROR: could not find bpftool"; \
-			exit 1; \
-		fi; \
-		echo "INFO: generating $(VMLINUXH) from $(BTFFILE)"; \
-		$(BPFTOOL) btf dump file $(BTFFILE) format c > $(VMLINUXH); \
-	fi
+	@if [ ! $(BPFTOOL) ]; then \
+		echo "ERROR: could not find bpftool"; \
+		exit 1; \
+	fi;
+
+	@echo "INFO: generating $(VMLINUXH) from $(BTFFILE)"; \
+	if ! $(BPFTOOL) btf dump file $(BTFFILE) format c > $(VMLINUXH); then \
+		echo "ERROR: could not create $(VMLINUXH)"; \
+		rm -f "$(VMLINUXH)"; \
+		exit 1; \
+	fi;
 
 # static libbpf generation for the git submodule
 
@@ -180,6 +190,54 @@ helpers-test-static-run: libbpfgo-static
 helpers-test-dynamic-run: libbpfgo-dynamic
 	sudo $(GO) test -v $(HELPERS)/...
 
+# vagrant
+
+VAGRANT_DIR = $(abspath ./builder)
+
+.PHONY: vagrant-up
+.PHONY: vagrant-destroy
+.PHONY: vagrant-halt
+.PHONY: vagrant-ssh
+
+vagrant-up: .vagrant-up
+vagrant-destroy: .vagrant-destroy
+vagrant-halt: .vagrant-halt
+vagrant-ssh: .vagrant-ssh
+
+.vagrant-%:
+	VAGRANT_VAGRANTFILE=$(VAGRANT_DIR)/Vagrantfile-ubuntu \
+		ARCH=$(ARCH) \
+		HOSTOS=$(HOSTOS) \
+		$(VAGRANT) $*
+
+# fmt-check
+
+fmt-check:
+	@errors=0
+	echo "Checking C and eBPF files and headers formatting..."
+	$(CLANG_FMT) --dry-run -i ./libbpfgo.h > /tmp/check-c-fmt 2>&1
+	clangfmtamount=$$(cat /tmp/check-c-fmt | wc -l)
+	if [[ $$clangfmtamount -ne 0 ]]; then
+		head -n30 /tmp/check-c-fmt
+		errors=1
+	fi
+	rm -f /tmp/check-c-fmt
+#
+	if [[ $$errors -ne 0 ]]; then
+		echo
+		echo "Please fix formatting errors above!"
+		echo "Use: $(MAKE) fmt-fix target".
+		echo
+		exit 1
+	fi
+
+
+# fmt-fix
+
+fmt-fix:
+	@echo "Fixing C and eBPF files and headers formatting..."
+	$(CLANG_FMT) -i --verbose ./libbpfgo.h
+
 # output
 
 $(OUTPUT):
diff --git a/vendor/github.com/aquasecurity/libbpfgo/Readme.md b/vendor/github.com/aquasecurity/libbpfgo/Readme.md
index 57be83e73..62dcad97d 100644
--- a/vendor/github.com/aquasecurity/libbpfgo/Readme.md
+++ b/vendor/github.com/aquasecurity/libbpfgo/Readme.md
@@ -114,6 +114,20 @@ libbpfgo does not yet have a regular schedule for cutting releases. There has no
 
 *Note*: some distributions might have local changes to their libbpf package and their version might include backports and/or fixes differently than upstream versions. In those cases we recommend that libbpfgo is used statically compiled.
 
+## Contributing
+
+To better receive you, libbpfgo makes available GNU Makefile rules for vagrant machines (amd64/arm64) that can be used to compile and test on Linux and Darwin hosts:
+
+| Makefile Rule     | Description                                         |
+|-------------------|-----------------------------------------------------|
+| vagrant-up        | starts and provisions the vagrant environment       |
+| vagrant-ssh       | connects to machine via SSH                         |
+| vagrant-halt      | stops the vagrant machine                           |
+| vagrant-destroy   | stops and deletes all traces of the vagrant machine |
+
+Once connected to the vagrant box you are ready to [build](#building) libbpfgo (e.g. `make libbpfgo-static`).
+
+For further information, check [Vagrantfile.md](./docs/Vagrantfile.md).
 
 ## Learn more
 
diff --git a/vendor/github.com/aquasecurity/libbpfgo/go.work b/vendor/github.com/aquasecurity/libbpfgo/go.work
new file mode 100644
index 000000000..28f130255
--- /dev/null
+++ b/vendor/github.com/aquasecurity/libbpfgo/go.work
@@ -0,0 +1,6 @@
+go 1.18
+
+use (
+	.
+	./helpers
+)
diff --git a/vendor/github.com/aquasecurity/libbpfgo/libbpf_cb.go b/vendor/github.com/aquasecurity/libbpfgo/libbpf_cb.go
index fc75c9d5c..b118ca7f4 100644
--- a/vendor/github.com/aquasecurity/libbpfgo/libbpf_cb.go
+++ b/vendor/github.com/aquasecurity/libbpfgo/libbpf_cb.go
@@ -10,13 +10,13 @@ import (
 
 //export perfCallback
 func perfCallback(ctx unsafe.Pointer, cpu C.int, data unsafe.Pointer, size C.int) {
-	pb := eventChannels.Get(uint(uintptr(ctx))).(*PerfBuffer)
+	pb := eventChannels.get(uint(uintptr(ctx))).(*PerfBuffer)
 	pb.eventsChan <- C.GoBytes(data, size)
 }
 
 //export perfLostCallback
 func perfLostCallback(ctx unsafe.Pointer, cpu C.int, cnt C.ulonglong) {
-	pb := eventChannels.Get(uint(uintptr(ctx))).(*PerfBuffer)
+	pb := eventChannels.get(uint(uintptr(ctx))).(*PerfBuffer)
 	if pb.lostChan != nil {
 		pb.lostChan <- uint64(cnt)
 	}
@@ -24,7 +24,7 @@ func perfLostCallback(ctx unsafe.Pointer, cpu C.int, cnt C.ulonglong) {
 
 //export ringbufferCallback
 func ringbufferCallback(ctx unsafe.Pointer, data unsafe.Pointer, size C.int) C.int {
-	ch := eventChannels.Get(uint(uintptr(ctx))).(chan []byte)
+	ch := eventChannels.get(uint(uintptr(ctx))).(chan []byte)
 	ch <- C.GoBytes(data, size)
 	return C.int(0)
 }
diff --git a/vendor/github.com/aquasecurity/libbpfgo/libbpfgo.go b/vendor/github.com/aquasecurity/libbpfgo/libbpfgo.go
index 9d4fc3952..d70615782 100644
--- a/vendor/github.com/aquasecurity/libbpfgo/libbpfgo.go
+++ b/vendor/github.com/aquasecurity/libbpfgo/libbpfgo.go
@@ -2,117 +2,7 @@ package libbpfgo
 
 /*
 #cgo LDFLAGS: -lelf -lz
-
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/resource.h>
-#include <sys/syscall.h>
-
-#include <bpf/bpf.h>
-#include <bpf/libbpf.h>
-
-
-int libbpf_print_fn(enum libbpf_print_level level,
-                    const char *format,
-                    va_list args)
-{
-	if (level != LIBBPF_WARN)
-		return 0;
-
-	va_list check;
-	va_copy(check, args);
-	char *str = va_arg(check, char *);
-
-	// BUG: https://github.com/aquasecurity/tracee/issues/1676
-
-	if (strstr(str, "Exclusivity flag on") != NULL) {
-		va_end(check);
-		return 0;
-	}
-
-	// AttachCgroupLegacy() will first try AttachCgroup() and it
-	// might fail. This is not an error and is the best way of
-	// probing for eBPF cgroup attachment link existence.
-
-	str = va_arg(check, char *);
-	if (strstr(str, "cgroup") != NULL) {
-		str = va_arg(check, char *);
-		if (strstr(str, "Invalid argument") != NULL)
-			return 0;
-	}
-
-	return vfprintf(stderr, format, args);
-}
-
-void set_print_fn()
-{
-    libbpf_set_print(libbpf_print_fn);
-}
-
-extern void perfCallback(void *ctx, int cpu, void *data, __u32 size);
-extern void perfLostCallback(void *ctx, int cpu, __u64 cnt);
-extern int ringbufferCallback(void *ctx, void *data, size_t size);
-
-struct ring_buffer * init_ring_buf(int map_fd, uintptr_t ctx)
-{
-    struct ring_buffer *rb = NULL;
-
-    rb = ring_buffer__new(map_fd, ringbufferCallback, (void*)ctx, NULL);
-    if (!rb) {
-        fprintf(stderr, "Failed to initialize ring buffer: %s\n", strerror(errno));
-        return NULL;
-    }
-
-    return rb;
-}
-
-struct perf_buffer * init_perf_buf(int map_fd, int page_cnt, uintptr_t ctx)
-{
-    struct perf_buffer_opts pb_opts = {};
-    struct perf_buffer *pb = NULL;
-
-    pb_opts.sz = sizeof(struct perf_buffer_opts);
-
-    pb = perf_buffer__new(map_fd, page_cnt, perfCallback, perfLostCallback,
-                          (void *) ctx, &pb_opts);
-    if (!pb) {
-        fprintf(stderr, "Failed to initialize perf buffer: %s\n", strerror(errno));
-        return NULL;
-    }
-
-    return pb;
-}
-
-int bpf_prog_attach_cgroup_legacy(
-	int prog_fd,          // eBPF program file descriptor
-	int target_fd,        // cgroup directory file descriptor
-	int type)             // BPF_CGROUP_INET_{INGRESS,EGRESS}, ...
-{
-	union bpf_attr attr;
-	memset(&attr, 0, sizeof(attr));
-	attr.target_fd = target_fd;
-	attr.attach_bpf_fd = prog_fd;
-	attr.attach_type = type;
-	attr.attach_flags = BPF_F_ALLOW_MULTI; // or BPF_F_ALLOW_OVERRIDE
-
-	return syscall(__NR_bpf, BPF_PROG_ATTACH, &attr, sizeof(attr));
-}
-
-int bpf_prog_detach_cgroup_legacy(
-	int prog_fd,          // eBPF program file descriptor
-	int target_fd,        // cgroup directory file descriptor
-	int type)             // BPF_CGROUP_INET_{INGRESS,EGRESS}, ...
-{
-	union bpf_attr attr;
-	memset(&attr, 0, sizeof(attr));
-	attr.target_fd = target_fd;
-	attr.attach_bpf_fd = prog_fd;
-	attr.attach_type = type;
-
-	return syscall(__NR_bpf, BPF_PROG_DETACH, &attr, sizeof(attr));
-}
+#include "libbpfgo.h"
 */
 import "C"
 
@@ -124,8 +14,6 @@ import (
 	"sync"
 	"syscall"
 	"unsafe"
-
-	"github.com/aquasecurity/libbpfgo/helpers/rwarray"
 )
 
 const (
@@ -453,30 +341,26 @@ func NewModuleFromBufferArgs(args NewModuleArgs) (*Module, error) {
 	if args.BTFObjPath == "" {
 		args.BTFObjPath = "/sys/kernel/btf/vmlinux"
 	}
-	btfFile := C.CString(args.BTFObjPath)
-	bpfName := C.CString(args.BPFObjName)
-	bpfBuff := unsafe.Pointer(C.CBytes(args.BPFObjBuff))
-	bpfBuffSize := C.size_t(len(args.BPFObjBuff))
 
-	opts := C.struct_bpf_object_open_opts{}
-	opts.object_name = bpfName
-	opts.sz = C.sizeof_struct_bpf_object_open_opts
-	opts.btf_custom_path = btfFile // instruct libbpf to use user provided kernel BTF file
+	CBTFFilePath := C.CString(args.BTFObjPath)
+	CKconfigPath := C.CString(args.KConfigFilePath)
+	CBPFObjName := C.CString(args.BPFObjName)
+	CBPFBuff := unsafe.Pointer(C.CBytes(args.BPFObjBuff))
+	CBPFBuffSize := C.size_t(len(args.BPFObjBuff))
 
-	if len(args.KConfigFilePath) > 2 {
-		kConfigFile := C.CString(args.KConfigFilePath)
-		opts.kconfig = kConfigFile // instruct libbpf to use user provided KConfigFile
-		defer C.free(unsafe.Pointer(kConfigFile))
+	if len(args.KConfigFilePath) <= 2 {
+		C.free(unsafe.Pointer(CKconfigPath))
+		CKconfigPath = nil
 	}
 
-	obj, errno := C.bpf_object__open_mem(bpfBuff, bpfBuffSize, &opts)
+	obj, errno := C.open_bpf_object(CBTFFilePath, CKconfigPath, CBPFObjName, CBPFBuff, CBPFBuffSize)
 	if obj == nil {
 		return nil, fmt.Errorf("failed to open BPF object %s: %w", args.BPFObjName, errno)
 	}
 
-	C.free(bpfBuff)
-	C.free(unsafe.Pointer(bpfName))
-	C.free(unsafe.Pointer(btfFile))
+	C.free(CBPFBuff)
+	C.free(unsafe.Pointer(CBPFObjName))
+	C.free(unsafe.Pointer(CBTFFilePath))
 
 	return &Module{
 		obj: obj,
@@ -1655,7 +1539,7 @@ func doAttachUprobe(prog *BPFProg, isUretprobe bool, pid int, path string, offse
 	return bpfLink, nil
 }
 
-var eventChannels = rwarray.NewRWArray(maxEventChannels)
+var eventChannels = newRWArray(maxEventChannels)
 
 func (m *Module) InitRingBuf(mapName string, eventsChan chan []byte) (*RingBuffer, error) {
 	bpfMap, err := m.GetMap(mapName)
@@ -1667,7 +1551,7 @@ func (m *Module) InitRingBuf(mapName string, eventsChan chan []byte) (*RingBuffe
 		return nil, fmt.Errorf("events channel can not be nil")
 	}
 
-	slot := eventChannels.Put(eventsChan)
+	slot := eventChannels.put(eventsChan)
 	if slot == -1 {
 		return nil, fmt.Errorf("max ring buffers reached")
 	}
@@ -1701,7 +1585,7 @@ func (rb *RingBuffer) Stop() {
 		// may have stopped at this point. Failure to drain it will
 		// result in a deadlock: the channel will fill up and the poll
 		// goroutine will block in the callback.
-		eventChan := eventChannels.Get(rb.slot).(chan []byte)
+		eventChan := eventChannels.get(rb.slot).(chan []byte)
 		go func() {
 			for range eventChan {
 			}
@@ -1725,7 +1609,7 @@ func (rb *RingBuffer) Close() {
 	}
 	rb.Stop()
 	C.ring_buffer__free(rb.rb)
-	eventChannels.Remove(rb.slot)
+	eventChannels.remove(rb.slot)
 	rb.closed = true
 }
 
@@ -1772,14 +1656,14 @@ func (m *Module) InitPerfBuf(mapName string, eventsChan chan []byte, lostChan ch
 		lostChan:   lostChan,
 	}
 
-	slot := eventChannels.Put(perfBuf)
+	slot := eventChannels.put(perfBuf)
 	if slot == -1 {
 		return nil, fmt.Errorf("max number of ring/perf buffers reached")
 	}
 
 	pb := C.init_perf_buf(bpfMap.fd, C.int(pageCnt), C.uintptr_t(slot))
 	if pb == nil {
-		eventChannels.Remove(uint(slot))
+		eventChannels.remove(uint(slot))
 		return nil, fmt.Errorf("failed to initialize perf buffer")
 	}
 
@@ -1836,7 +1720,7 @@ func (pb *PerfBuffer) Close() {
 	}
 	pb.Stop()
 	C.perf_buffer__free(pb.pb)
-	eventChannels.Remove(pb.slot)
+	eventChannels.remove(pb.slot)
 	pb.closed = true
 }
 
diff --git a/vendor/github.com/aquasecurity/libbpfgo/libbpfgo.h b/vendor/github.com/aquasecurity/libbpfgo/libbpfgo.h
new file mode 100644
index 000000000..6b9abd274
--- /dev/null
+++ b/vendor/github.com/aquasecurity/libbpfgo/libbpfgo.h
@@ -0,0 +1,138 @@
+#ifndef __LIBBPF_GO_H__
+#define __LIBBPF_GO_H__
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/resource.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#include <bpf/bpf.h>
+#include <bpf/libbpf.h>
+
+int libbpf_print_fn(enum libbpf_print_level level, const char *format,
+                    va_list args) {
+  if (level != LIBBPF_WARN)
+    return 0;
+
+  // NOTE: va_list args is managed in libbpf caller
+  // however, these copies must be matched with va_end() in this function
+  va_list exclusivity_check, cgroup_check;
+  va_copy(exclusivity_check, args);
+  va_copy(cgroup_check, args);
+
+  // BUG: https://github.com/aquasecurity/tracee/issues/1676
+
+  char *str = va_arg(exclusivity_check, char *);
+  if (strstr(str, "Exclusivity flag on") != NULL) {
+    va_end(exclusivity_check);
+    return 0;
+  }
+  va_end(exclusivity_check);
+
+  // AttachCgroupLegacy() will first try AttachCgroup() and it
+  // might fail. This is not an error and is the best way of
+  // probing for eBPF cgroup attachment link existence.
+
+  str = va_arg(cgroup_check, char *);
+  if (strstr(str, "cgroup") != NULL) {
+    str = va_arg(cgroup_check, char *);
+    if (strstr(str, "Invalid argument") != NULL) {
+      va_end(cgroup_check);
+      return 0;
+    }
+  }
+  va_end(cgroup_check);
+
+  return vfprintf(stderr, format, args);
+}
+
+void set_print_fn() { libbpf_set_print(libbpf_print_fn); }
+
+extern void perfCallback(void *ctx, int cpu, void *data, __u32 size);
+extern void perfLostCallback(void *ctx, int cpu, __u64 cnt);
+extern int ringbufferCallback(void *ctx, void *data, size_t size);
+
+struct ring_buffer *init_ring_buf(int map_fd, uintptr_t ctx) {
+  struct ring_buffer *rb = NULL;
+
+  rb = ring_buffer__new(map_fd, ringbufferCallback, (void *)ctx, NULL);
+  if (!rb) {
+    int saved_errno = errno;
+    fprintf(stderr, "Failed to initialize ring buffer: %s\n", strerror(errno));
+    errno = saved_errno;
+    return NULL;
+  }
+
+  return rb;
+}
+
+struct perf_buffer *init_perf_buf(int map_fd, int page_cnt, uintptr_t ctx) {
+  struct perf_buffer_opts pb_opts = {};
+  struct perf_buffer *pb = NULL;
+
+  pb_opts.sz = sizeof(struct perf_buffer_opts);
+
+  pb = perf_buffer__new(map_fd, page_cnt, perfCallback, perfLostCallback,
+                        (void *)ctx, &pb_opts);
+  if (!pb) {
+    int saved_errno = errno;
+    fprintf(stderr, "Failed to initialize perf buffer: %s\n", strerror(errno));
+    errno = saved_errno;
+    return NULL;
+  }
+
+  return pb;
+}
+
+int bpf_prog_attach_cgroup_legacy(
+    int prog_fd,   // eBPF program file descriptor
+    int target_fd, // cgroup directory file descriptor
+    int type)      // BPF_CGROUP_INET_{INGRESS,EGRESS}, ...
+{
+  union bpf_attr attr;
+  memset(&attr, 0, sizeof(attr));
+  attr.target_fd = target_fd;
+  attr.attach_bpf_fd = prog_fd;
+  attr.attach_type = type;
+  attr.attach_flags = BPF_F_ALLOW_MULTI; // or BPF_F_ALLOW_OVERRIDE
+
+  return syscall(__NR_bpf, BPF_PROG_ATTACH, &attr, sizeof(attr));
+}
+
+int bpf_prog_detach_cgroup_legacy(
+    int prog_fd,   // eBPF program file descriptor
+    int target_fd, // cgroup directory file descriptor
+    int type)      // BPF_CGROUP_INET_{INGRESS,EGRESS}, ...
+{
+  union bpf_attr attr;
+  memset(&attr, 0, sizeof(attr));
+  attr.target_fd = target_fd;
+  attr.attach_bpf_fd = prog_fd;
+  attr.attach_type = type;
+
+  return syscall(__NR_bpf, BPF_PROG_DETACH, &attr, sizeof(attr));
+}
+
+struct bpf_object *open_bpf_object(char *btf_file_path, char *kconfig_path,
+                                   char *bpf_obj_name, const void *obj_buf,
+                                   size_t obj_buf_size) {
+  struct bpf_object_open_opts opts = {};
+  opts.btf_custom_path = btf_file_path;
+  opts.kconfig = kconfig_path;
+  opts.object_name = bpf_obj_name;
+  opts.sz = sizeof(opts);
+
+  struct bpf_object *obj = bpf_object__open_mem(obj_buf, obj_buf_size, &opts);
+  if (obj == NULL) {
+    int saved_errno = errno;
+    fprintf(stderr, "Failed to open bpf object: %s\n", strerror(errno));
+    errno = saved_errno;
+    return NULL;
+  }
+
+  return obj;
+}
+
+#endif
diff --git a/vendor/github.com/aquasecurity/libbpfgo/helpers/rwarray/rwArray.go b/vendor/github.com/aquasecurity/libbpfgo/rwArray.go
similarity index 75%
rename from vendor/github.com/aquasecurity/libbpfgo/helpers/rwarray/rwArray.go
rename to vendor/github.com/aquasecurity/libbpfgo/rwArray.go
index 678aa8dc8..211a8ca22 100644
--- a/vendor/github.com/aquasecurity/libbpfgo/helpers/rwarray/rwArray.go
+++ b/vendor/github.com/aquasecurity/libbpfgo/rwArray.go
@@ -1,4 +1,4 @@
-package rwarray
+package libbpfgo
 
 import (
 	"sync"
@@ -9,7 +9,7 @@ type slot struct {
 	used  bool
 }
 
-// RWArray allows for multiple concurrent readers but
+// rwArray allows for multiple concurrent readers but
 // only a single writer. The writers lock a mutex while the readers
 // are lock free.
 // It is implemented as an array of slots where each slot holds a
@@ -18,18 +18,18 @@ type slot struct {
 // looking for an available slot as indicated by the in-use marker.
 // While probing, it is not touching the value itself, as it's
 // being read without a lock by the readers.
-type RWArray struct {
+type rwArray struct {
 	slots []slot
 	mux   sync.Mutex
 }
 
-func NewRWArray(capacity uint) RWArray {
-	return RWArray{
+func newRWArray(capacity uint) rwArray {
+	return rwArray{
 		slots: make([]slot, capacity),
 	}
 }
 
-func (a *RWArray) Put(v interface{}) int {
+func (a *rwArray) put(v interface{}) int {
 	a.mux.Lock()
 	defer a.mux.Unlock()
 
@@ -47,7 +47,7 @@ func (a *RWArray) Put(v interface{}) int {
 	return -1
 }
 
-func (a *RWArray) Remove(index uint) {
+func (a *rwArray) remove(index uint) {
 	a.mux.Lock()
 	defer a.mux.Unlock()
 
@@ -59,17 +59,17 @@ func (a *RWArray) Remove(index uint) {
 	a.slots[index].used = false
 }
 
-func (a *RWArray) Get(index uint) interface{} {
+func (a *rwArray) get(index uint) interface{} {
 	if int(index) >= len(a.slots) {
 		return nil
 	}
 
 	// N.B. If slot[index].used == false, this is technically
-	// a race since Put() might be putting the value in there
+	// a race since put() might be putting the value in there
 	// at the same time.
 	return a.slots[index].value
 }
 
-func (a *RWArray) Capacity() uint {
+func (a *rwArray) capacity() uint {
 	return uint(len(a.slots))
 }
diff --git a/vendor/github.com/urfave/cli/v2/Makefile b/vendor/github.com/urfave/cli/v2/Makefile
index 797d093e9..f0d41905e 100644
--- a/vendor/github.com/urfave/cli/v2/Makefile
+++ b/vendor/github.com/urfave/cli/v2/Makefile
@@ -7,7 +7,7 @@
 GO_RUN_BUILD := go run internal/build/build.go
 
 .PHONY: all
-all: generate vet tag-test test check-binary-size tag-check-binary-size gfmrun yamlfmt v2diff
+all: generate vet test check-binary-size gfmrun yamlfmt v2diff
 
 # NOTE: this is a special catch-all rule to run any of the commands
 # defined in internal/build/build.go with optional arguments passed
diff --git a/vendor/github.com/urfave/cli/v2/app.go b/vendor/github.com/urfave/cli/v2/app.go
index 9f72f1b4f..0ae3f5247 100644
--- a/vendor/github.com/urfave/cli/v2/app.go
+++ b/vendor/github.com/urfave/cli/v2/app.go
@@ -229,7 +229,9 @@ func (a *App) Setup() {
 	a.flagCategories = newFlagCategories()
 	for _, fl := range a.Flags {
 		if cf, ok := fl.(CategorizableFlag); ok {
-			a.flagCategories.AddFlag(cf.GetCategory(), cf)
+			if cf.GetCategory() != "" {
+				a.flagCategories.AddFlag(cf.GetCategory(), cf)
+			}
 		}
 	}
 
diff --git a/vendor/github.com/urfave/cli/v2/category.go b/vendor/github.com/urfave/cli/v2/category.go
index 8bf325e20..7aca0c768 100644
--- a/vendor/github.com/urfave/cli/v2/category.go
+++ b/vendor/github.com/urfave/cli/v2/category.go
@@ -102,7 +102,9 @@ func newFlagCategoriesFromFlags(fs []Flag) FlagCategories {
 	fc := newFlagCategories()
 	for _, fl := range fs {
 		if cf, ok := fl.(CategorizableFlag); ok {
-			fc.AddFlag(cf.GetCategory(), cf)
+			if cf.GetCategory() != "" {
+				fc.AddFlag(cf.GetCategory(), cf)
+			}
 		}
 	}
 
diff --git a/vendor/github.com/urfave/cli/v2/command.go b/vendor/github.com/urfave/cli/v2/command.go
index d24b61e23..037ebc52c 100644
--- a/vendor/github.com/urfave/cli/v2/command.go
+++ b/vendor/github.com/urfave/cli/v2/command.go
@@ -295,15 +295,21 @@ func (c *Command) startApp(ctx *Context) error {
 	return app.RunAsSubcommand(ctx)
 }
 
+// VisibleCommands returns a slice of the Commands with Hidden=false
+func (c *Command) VisibleCommands() []*Command {
+	var ret []*Command
+	for _, command := range c.Subcommands {
+		if !command.Hidden {
+			ret = append(ret, command)
+		}
+	}
+	return ret
+}
+
 // VisibleFlagCategories returns a slice containing all the visible flag categories with the flags they contain
 func (c *Command) VisibleFlagCategories() []VisibleFlagCategory {
 	if c.flagCategories == nil {
-		c.flagCategories = newFlagCategories()
-		for _, fl := range c.Flags {
-			if cf, ok := fl.(CategorizableFlag); ok {
-				c.flagCategories.AddFlag(cf.GetCategory(), cf)
-			}
-		}
+		c.flagCategories = newFlagCategoriesFromFlags(c.Flags)
 	}
 	return c.flagCategories.VisibleCategories()
 }
diff --git a/vendor/github.com/urfave/cli/v2/flag.go b/vendor/github.com/urfave/cli/v2/flag.go
index 7b5ec498c..a6fea1c49 100644
--- a/vendor/github.com/urfave/cli/v2/flag.go
+++ b/vendor/github.com/urfave/cli/v2/flag.go
@@ -129,6 +129,14 @@ type DocGenerationFlag interface {
 	GetEnvVars() []string
 }
 
+// DocGenerationSliceFlag extends DocGenerationFlag for slice-based flags.
+type DocGenerationSliceFlag interface {
+	DocGenerationFlag
+
+	// IsSliceFlag returns true for flags that can be given multiple times.
+	IsSliceFlag() bool
+}
+
 // VisibleFlag is an interface that allows to check if a flag is visible
 type VisibleFlag interface {
 	Flag
@@ -325,24 +333,13 @@ func stringifyFlag(f Flag) string {
 
 	usageWithDefault := strings.TrimSpace(usage + defaultValueString)
 
-	return withEnvHint(df.GetEnvVars(),
-		fmt.Sprintf("%s\t%s", prefixedNames(df.Names(), placeholder), usageWithDefault))
-}
-
-func stringifySliceFlag(usage string, names, defaultVals []string) string {
-	placeholder, usage := unquoteUsage(usage)
-	if placeholder == "" {
-		placeholder = defaultPlaceholder
-	}
-
-	defaultVal := ""
-	if len(defaultVals) > 0 {
-		defaultVal = fmt.Sprintf(formatDefault("%s"), strings.Join(defaultVals, ", "))
+	pn := prefixedNames(df.Names(), placeholder)
+	sliceFlag, ok := f.(DocGenerationSliceFlag)
+	if ok && sliceFlag.IsSliceFlag() {
+		pn = pn + " [ " + pn + " ]"
 	}
 
-	usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal))
-	pn := prefixedNames(names, placeholder)
-	return fmt.Sprintf("%s [ %s ]\t%s", pn, pn, usageWithDefault)
+	return withEnvHint(df.GetEnvVars(), fmt.Sprintf("%s\t%s", pn, usageWithDefault))
 }
 
 func hasFlag(flags []Flag, fl Flag) bool {
diff --git a/vendor/github.com/urfave/cli/v2/flag_float64_slice.go b/vendor/github.com/urfave/cli/v2/flag_float64_slice.go
index 2cb5e4adf..413aa50e9 100644
--- a/vendor/github.com/urfave/cli/v2/flag_float64_slice.go
+++ b/vendor/github.com/urfave/cli/v2/flag_float64_slice.go
@@ -83,7 +83,7 @@ func (f *Float64Slice) Get() interface{} {
 // String returns a readable representation of this value
 // (for usage defaults)
 func (f *Float64SliceFlag) String() string {
-	return withEnvHint(f.GetEnvVars(), f.stringify())
+	return FlagStringer(f)
 }
 
 // TakesValue returns true if the flag takes a value, otherwise false
@@ -104,10 +104,13 @@ func (f *Float64SliceFlag) GetCategory() string {
 // GetValue returns the flags value as string representation and an empty
 // string if the flag takes no value at all.
 func (f *Float64SliceFlag) GetValue() string {
-	if f.Value != nil {
-		return f.Value.String()
+	var defaultVals []string
+	if f.Value != nil && len(f.Value.Value()) > 0 {
+		for _, i := range f.Value.Value() {
+			defaultVals = append(defaultVals, strings.TrimRight(strings.TrimRight(fmt.Sprintf("%f", i), "0"), "."))
+		}
 	}
-	return ""
+	return strings.Join(defaultVals, ", ")
 }
 
 // GetDefaultText returns the default text for this flag
@@ -123,6 +126,11 @@ func (f *Float64SliceFlag) GetEnvVars() []string {
 	return f.EnvVars
 }
 
+// IsSliceFlag implements DocGenerationSliceFlag.
+func (f *Float64SliceFlag) IsSliceFlag() bool {
+	return true
+}
+
 // Apply populates the flag given the flag set and environment
 func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error {
 	// apply any default
@@ -169,18 +177,6 @@ func (f *Float64SliceFlag) Get(ctx *Context) []float64 {
 	return ctx.Float64Slice(f.Name)
 }
 
-func (f *Float64SliceFlag) stringify() string {
-	var defaultVals []string
-
-	if f.Value != nil && len(f.Value.Value()) > 0 {
-		for _, i := range f.Value.Value() {
-			defaultVals = append(defaultVals, strings.TrimRight(strings.TrimRight(fmt.Sprintf("%f", i), "0"), "."))
-		}
-	}
-
-	return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
-}
-
 // RunAction executes flag action if set
 func (f *Float64SliceFlag) RunAction(c *Context) error {
 	if f.Action != nil {
diff --git a/vendor/github.com/urfave/cli/v2/flag_generic.go b/vendor/github.com/urfave/cli/v2/flag_generic.go
index 5034728c4..358bd966e 100644
--- a/vendor/github.com/urfave/cli/v2/flag_generic.go
+++ b/vendor/github.com/urfave/cli/v2/flag_generic.go
@@ -62,6 +62,10 @@ func (f *GenericFlag) Apply(set *flag.FlagSet) error {
 	}
 
 	for _, name := range f.Names() {
+		if f.Destination != nil {
+			set.Var(f.Destination, name, f.Usage)
+			continue
+		}
 		set.Var(f.Value, name, f.Usage)
 	}
 
diff --git a/vendor/github.com/urfave/cli/v2/flag_int64_slice.go b/vendor/github.com/urfave/cli/v2/flag_int64_slice.go
index d4a11b6a8..c45c43d3a 100644
--- a/vendor/github.com/urfave/cli/v2/flag_int64_slice.go
+++ b/vendor/github.com/urfave/cli/v2/flag_int64_slice.go
@@ -84,7 +84,7 @@ func (i *Int64Slice) Get() interface{} {
 // String returns a readable representation of this value
 // (for usage defaults)
 func (f *Int64SliceFlag) String() string {
-	return withEnvHint(f.GetEnvVars(), f.stringify())
+	return FlagStringer(f)
 }
 
 // TakesValue returns true of the flag takes a value, otherwise false
@@ -105,10 +105,13 @@ func (f *Int64SliceFlag) GetCategory() string {
 // GetValue returns the flags value as string representation and an empty
 // string if the flag takes no value at all.
 func (f *Int64SliceFlag) GetValue() string {
-	if f.Value != nil {
-		return f.Value.String()
+	var defaultVals []string
+	if f.Value != nil && len(f.Value.Value()) > 0 {
+		for _, i := range f.Value.Value() {
+			defaultVals = append(defaultVals, strconv.FormatInt(i, 10))
+		}
 	}
-	return ""
+	return strings.Join(defaultVals, ", ")
 }
 
 // GetDefaultText returns the default text for this flag
@@ -124,6 +127,11 @@ func (f *Int64SliceFlag) GetEnvVars() []string {
 	return f.EnvVars
 }
 
+// IsSliceFlag implements DocGenerationSliceFlag.
+func (f *Int64SliceFlag) IsSliceFlag() bool {
+	return true
+}
+
 // Apply populates the flag given the flag set and environment
 func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error {
 	// apply any default
@@ -168,17 +176,6 @@ func (f *Int64SliceFlag) Get(ctx *Context) []int64 {
 	return ctx.Int64Slice(f.Name)
 }
 
-func (f *Int64SliceFlag) stringify() string {
-	var defaultVals []string
-	if f.Value != nil && len(f.Value.Value()) > 0 {
-		for _, i := range f.Value.Value() {
-			defaultVals = append(defaultVals, strconv.FormatInt(i, 10))
-		}
-	}
-
-	return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
-}
-
 // RunAction executes flag action if set
 func (f *Int64SliceFlag) RunAction(c *Context) error {
 	if f.Action != nil {
diff --git a/vendor/github.com/urfave/cli/v2/flag_int_slice.go b/vendor/github.com/urfave/cli/v2/flag_int_slice.go
index 2cabe7202..d4006e594 100644
--- a/vendor/github.com/urfave/cli/v2/flag_int_slice.go
+++ b/vendor/github.com/urfave/cli/v2/flag_int_slice.go
@@ -95,7 +95,7 @@ func (i *IntSlice) Get() interface{} {
 // String returns a readable representation of this value
 // (for usage defaults)
 func (f *IntSliceFlag) String() string {
-	return withEnvHint(f.GetEnvVars(), f.stringify())
+	return FlagStringer(f)
 }
 
 // TakesValue returns true of the flag takes a value, otherwise false
@@ -116,10 +116,13 @@ func (f *IntSliceFlag) GetCategory() string {
 // GetValue returns the flags value as string representation and an empty
 // string if the flag takes no value at all.
 func (f *IntSliceFlag) GetValue() string {
-	if f.Value != nil {
-		return f.Value.String()
+	var defaultVals []string
+	if f.Value != nil && len(f.Value.Value()) > 0 {
+		for _, i := range f.Value.Value() {
+			defaultVals = append(defaultVals, strconv.Itoa(i))
+		}
 	}
-	return ""
+	return strings.Join(defaultVals, ", ")
 }
 
 // GetDefaultText returns the default text for this flag
@@ -135,6 +138,11 @@ func (f *IntSliceFlag) GetEnvVars() []string {
 	return f.EnvVars
 }
 
+// IsSliceFlag implements DocGenerationSliceFlag.
+func (f *IntSliceFlag) IsSliceFlag() bool {
+	return true
+}
+
 // Apply populates the flag given the flag set and environment
 func (f *IntSliceFlag) Apply(set *flag.FlagSet) error {
 	// apply any default
@@ -188,17 +196,6 @@ func (f *IntSliceFlag) RunAction(c *Context) error {
 	return nil
 }
 
-func (f *IntSliceFlag) stringify() string {
-	var defaultVals []string
-	if f.Value != nil && len(f.Value.Value()) > 0 {
-		for _, i := range f.Value.Value() {
-			defaultVals = append(defaultVals, strconv.Itoa(i))
-		}
-	}
-
-	return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
-}
-
 // IntSlice looks up the value of a local IntSliceFlag, returns
 // nil if not found
 func (cCtx *Context) IntSlice(name string) []int {
diff --git a/vendor/github.com/urfave/cli/v2/flag_string_slice.go b/vendor/github.com/urfave/cli/v2/flag_string_slice.go
index 7b46a2474..baca2a2fb 100644
--- a/vendor/github.com/urfave/cli/v2/flag_string_slice.go
+++ b/vendor/github.com/urfave/cli/v2/flag_string_slice.go
@@ -74,7 +74,7 @@ func (s *StringSlice) Get() interface{} {
 // String returns a readable representation of this value
 // (for usage defaults)
 func (f *StringSliceFlag) String() string {
-	return withEnvHint(f.GetEnvVars(), f.stringify())
+	return FlagStringer(f)
 }
 
 // TakesValue returns true of the flag takes a value, otherwise false
@@ -95,10 +95,15 @@ func (f *StringSliceFlag) GetCategory() string {
 // GetValue returns the flags value as string representation and an empty
 // string if the flag takes no value at all.
 func (f *StringSliceFlag) GetValue() string {
-	if f.Value != nil {
-		return f.Value.String()
+	var defaultVals []string
+	if f.Value != nil && len(f.Value.Value()) > 0 {
+		for _, s := range f.Value.Value() {
+			if len(s) > 0 {
+				defaultVals = append(defaultVals, strconv.Quote(s))
+			}
+		}
 	}
-	return ""
+	return strings.Join(defaultVals, ", ")
 }
 
 // GetDefaultText returns the default text for this flag
@@ -114,6 +119,11 @@ func (f *StringSliceFlag) GetEnvVars() []string {
 	return f.EnvVars
 }
 
+// IsSliceFlag implements DocGenerationSliceFlag.
+func (f *StringSliceFlag) IsSliceFlag() bool {
+	return true
+}
+
 // Apply populates the flag given the flag set and environment
 func (f *StringSliceFlag) Apply(set *flag.FlagSet) error {
 	// apply any default
@@ -158,19 +168,6 @@ func (f *StringSliceFlag) Get(ctx *Context) []string {
 	return ctx.StringSlice(f.Name)
 }
 
-func (f *StringSliceFlag) stringify() string {
-	var defaultVals []string
-	if f.Value != nil && len(f.Value.Value()) > 0 {
-		for _, s := range f.Value.Value() {
-			if len(s) > 0 {
-				defaultVals = append(defaultVals, strconv.Quote(s))
-			}
-		}
-	}
-
-	return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
-}
-
 // RunAction executes flag action if set
 func (f *StringSliceFlag) RunAction(c *Context) error {
 	if f.Action != nil {
diff --git a/vendor/github.com/urfave/cli/v2/flag_uint64_slice.go b/vendor/github.com/urfave/cli/v2/flag_uint64_slice.go
index e60c3ea8a..61bb30b55 100644
--- a/vendor/github.com/urfave/cli/v2/flag_uint64_slice.go
+++ b/vendor/github.com/urfave/cli/v2/flag_uint64_slice.go
@@ -88,7 +88,7 @@ func (i *Uint64Slice) Get() interface{} {
 // String returns a readable representation of this value
 // (for usage defaults)
 func (f *Uint64SliceFlag) String() string {
-	return withEnvHint(f.GetEnvVars(), f.stringify())
+	return FlagStringer(f)
 }
 
 // TakesValue returns true of the flag takes a value, otherwise false
@@ -109,10 +109,13 @@ func (f *Uint64SliceFlag) GetCategory() string {
 // GetValue returns the flags value as string representation and an empty
 // string if the flag takes no value at all.
 func (f *Uint64SliceFlag) GetValue() string {
-	if f.Value != nil {
-		return f.Value.String()
+	var defaultVals []string
+	if f.Value != nil && len(f.Value.Value()) > 0 {
+		for _, i := range f.Value.Value() {
+			defaultVals = append(defaultVals, strconv.FormatUint(i, 10))
+		}
 	}
-	return ""
+	return strings.Join(defaultVals, ", ")
 }
 
 // GetDefaultText returns the default text for this flag
@@ -128,6 +131,11 @@ func (f *Uint64SliceFlag) GetEnvVars() []string {
 	return f.EnvVars
 }
 
+// IsSliceFlag implements DocGenerationSliceFlag.
+func (f *Uint64SliceFlag) IsSliceFlag() bool {
+	return true
+}
+
 // Apply populates the flag given the flag set and environment
 func (f *Uint64SliceFlag) Apply(set *flag.FlagSet) error {
 	// apply any default
@@ -172,17 +180,6 @@ func (f *Uint64SliceFlag) Get(ctx *Context) []uint64 {
 	return ctx.Uint64Slice(f.Name)
 }
 
-func (f *Uint64SliceFlag) stringify() string {
-	var defaultVals []string
-	if f.Value != nil && len(f.Value.Value()) > 0 {
-		for _, i := range f.Value.Value() {
-			defaultVals = append(defaultVals, strconv.FormatUint(i, 10))
-		}
-	}
-
-	return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
-}
-
 // Uint64Slice looks up the value of a local Uint64SliceFlag, returns
 // nil if not found
 func (cCtx *Context) Uint64Slice(name string) []uint64 {
diff --git a/vendor/github.com/urfave/cli/v2/flag_uint_slice.go b/vendor/github.com/urfave/cli/v2/flag_uint_slice.go
index 350b29ccf..363aa657f 100644
--- a/vendor/github.com/urfave/cli/v2/flag_uint_slice.go
+++ b/vendor/github.com/urfave/cli/v2/flag_uint_slice.go
@@ -99,7 +99,7 @@ func (i *UintSlice) Get() interface{} {
 // String returns a readable representation of this value
 // (for usage defaults)
 func (f *UintSliceFlag) String() string {
-	return withEnvHint(f.GetEnvVars(), f.stringify())
+	return FlagStringer(f)
 }
 
 // TakesValue returns true of the flag takes a value, otherwise false
@@ -120,10 +120,13 @@ func (f *UintSliceFlag) GetCategory() string {
 // GetValue returns the flags value as string representation and an empty
 // string if the flag takes no value at all.
 func (f *UintSliceFlag) GetValue() string {
-	if f.Value != nil {
-		return f.Value.String()
+	var defaultVals []string
+	if f.Value != nil && len(f.Value.Value()) > 0 {
+		for _, i := range f.Value.Value() {
+			defaultVals = append(defaultVals, strconv.FormatUint(uint64(i), 10))
+		}
 	}
-	return ""
+	return strings.Join(defaultVals, ", ")
 }
 
 // GetDefaultText returns the default text for this flag
@@ -139,6 +142,11 @@ func (f *UintSliceFlag) GetEnvVars() []string {
 	return f.EnvVars
 }
 
+// IsSliceFlag implements DocGenerationSliceFlag.
+func (f *UintSliceFlag) IsSliceFlag() bool {
+	return true
+}
+
 // Apply populates the flag given the flag set and environment
 func (f *UintSliceFlag) Apply(set *flag.FlagSet) error {
 	// apply any default
@@ -183,17 +191,6 @@ func (f *UintSliceFlag) Get(ctx *Context) []uint {
 	return ctx.UintSlice(f.Name)
 }
 
-func (f *UintSliceFlag) stringify() string {
-	var defaultVals []string
-	if f.Value != nil && len(f.Value.Value()) > 0 {
-		for _, i := range f.Value.Value() {
-			defaultVals = append(defaultVals, strconv.FormatUint(uint64(i), 10))
-		}
-	}
-
-	return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
-}
-
 // UintSlice looks up the value of a local UintSliceFlag, returns
 // nil if not found
 func (cCtx *Context) UintSlice(name string) []uint {
diff --git a/vendor/github.com/urfave/cli/v2/godoc-current.txt b/vendor/github.com/urfave/cli/v2/godoc-current.txt
index 3d5cb9a29..b6e3d4300 100644
--- a/vendor/github.com/urfave/cli/v2/godoc-current.txt
+++ b/vendor/github.com/urfave/cli/v2/godoc-current.txt
@@ -32,7 +32,7 @@ var (
 	SuggestDidYouMeanTemplate string             = suggestDidYouMeanTemplate
 )
 var AppHelpTemplate = `NAME:
-   {{$v := offset .Name 6}}{{wrap .Name 3}}{{if .Usage}} - {{wrap .Usage $v}}{{end}}
+   {{template "helpNameTemplate" .}}
 
 USAGE:
    {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}
@@ -41,51 +41,39 @@ VERSION:
    {{.Version}}{{end}}{{end}}{{if .Description}}
 
 DESCRIPTION:
-   {{wrap .Description 3}}{{end}}{{if len .Authors}}
+   {{template "descriptionTemplate" .}}{{end}}
+{{- if len .Authors}}
 
-AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
-   {{range $index, $author := .Authors}}{{if $index}}
-   {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
+AUTHOR{{template "authorsTemplate" .}}{{end}}{{if .VisibleCommands}}
 
-COMMANDS:{{range .VisibleCategories}}{{if .Name}}
-   {{.Name}}:{{range .VisibleCommands}}
-     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{ $cv := offsetCommands .VisibleCommands 5}}{{range .VisibleCommands}}
-   {{$s := join .Names ", "}}{{$s}}{{ $sp := subtract $cv (offset $s 3) }}{{ indent $sp ""}}{{wrap .Usage $cv}}{{end}}{{end}}{{end}}{{end}}{{if .VisibleFlagCategories}}
+COMMANDS:{{template "visibleCommandCategoryTemplate" .}}{{end}}{{if .VisibleFlagCategories}}
 
-GLOBAL OPTIONS:{{range .VisibleFlagCategories}}
-   {{if .Name}}{{.Name}}
-   {{end}}{{range .Flags}}{{.}}
-   {{end}}{{end}}{{else}}{{if .VisibleFlags}}
+GLOBAL OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}}
 
-GLOBAL OPTIONS:
-   {{range $index, $option := .VisibleFlags}}{{if $index}}
-   {{end}}{{wrap $option.String 6}}{{end}}{{end}}{{end}}{{if .Copyright}}
+GLOBAL OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}{{if .Copyright}}
 
 COPYRIGHT:
-   {{wrap .Copyright 3}}{{end}}
+   {{template "copyrightTemplate" .}}{{end}}
 `
     AppHelpTemplate is the text template for the Default help topic. cli.go
     uses text/template to render templates. You can render custom help text by
     setting this variable.
 
 var CommandHelpTemplate = `NAME:
-   {{$v := offset .HelpName 6}}{{wrap .HelpName 3}}{{if .Usage}} - {{wrap .Usage $v}}{{end}}
+   {{template "helpNameTemplate" .}}
 
 USAGE:
-   {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}}
+   {{template "usageTemplate" .}}{{if .Category}}
 
 CATEGORY:
    {{.Category}}{{end}}{{if .Description}}
 
 DESCRIPTION:
-   {{wrap .Description 3}}{{end}}{{if .VisibleFlagCategories}}
+   {{template "descriptionTemplate" .}}{{end}}{{if .VisibleFlagCategories}}
 
-OPTIONS:{{range .VisibleFlagCategories}}
-   {{if .Name}}{{.Name}}
-   {{end}}{{range .Flags}}{{.}}{{end}}{{end}}{{else}}{{if .VisibleFlags}}
+OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}}
 
-OPTIONS:
-   {{range .VisibleFlags}}{{.}}{{end}}{{end}}{{end}}
+OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}
 `
     CommandHelpTemplate is the text template for the command help topic. cli.go
     uses text/template to render templates. You can render custom help text by
@@ -145,21 +133,19 @@ var OsExiter = os.Exit
     os.Exit.
 
 var SubcommandHelpTemplate = `NAME:
-   {{.HelpName}} - {{.Usage}}
+   {{template "helpNameTemplate" .}}
 
 USAGE:
    {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Description}}
 
 DESCRIPTION:
-   {{wrap .Description 3}}{{end}}
+   {{template "descriptionTemplate" .}}{{end}}{{if .VisibleCommands}}
 
-COMMANDS:{{range .VisibleCategories}}{{if .Name}}
-   {{.Name}}:{{range .VisibleCommands}}
-     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{ $cv := offsetCommands .VisibleCommands 5}}{{range .VisibleCommands}}
-     {{$s := join .Names ", "}}{{$s}}{{ $sp := subtract $cv (offset $s 3) }}{{ indent $sp ""}}{{wrap .Usage $cv}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
+COMMANDS:{{template "visibleCommandTemplate" .}}{{end}}{{if .VisibleFlagCategories}}
 
-OPTIONS:
-   {{range .VisibleFlags}}{{.}}{{end}}{{end}}
+OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}}
+
+OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}
 `
     SubcommandHelpTemplate is the text template for the subcommand help topic.
     cli.go uses text/template to render templates. You can render custom help
@@ -458,6 +444,8 @@ type BoolFlag struct {
 	EnvVars []string
 
 	Count *int
+
+	Action func(*Context, bool) error
 }
     BoolFlag is a flag with type bool
 
@@ -565,7 +553,6 @@ type Command struct {
 	// cli.go uses text/template to render templates. You can
 	// render custom help text by setting this variable.
 	CustomHelpTemplate string
-
 	// Has unexported fields.
 }
     Command is a subcommand for a cli.App.
@@ -584,10 +571,6 @@ func (c *Command) Run(ctx *Context) (err error)
     Run invokes the command given the context, parses ctx.Args() to generate
     command-specific flags
 
-func (c *Command) VisibleCategories() []CommandCategory
-    VisibleCategories returns a slice of categories and commands that are
-    Hidden=false
-
 func (c *Command) VisibleCommands() []*Command
     VisibleCommands returns a slice of the Commands with Hidden=false
 
@@ -759,6 +742,14 @@ type DocGenerationFlag interface {
     DocGenerationFlag is an interface that allows documentation generation for
     the flag
 
+type DocGenerationSliceFlag interface {
+	DocGenerationFlag
+
+	// IsSliceFlag returns true for flags that can be given multiple times.
+	IsSliceFlag() bool
+}
+    DocGenerationSliceFlag extends DocGenerationFlag for slice-based flags.
+
 type DurationFlag struct {
 	Name string
 
@@ -776,6 +767,8 @@ type DurationFlag struct {
 
 	Aliases []string
 	EnvVars []string
+
+	Action func(*Context, time.Duration) error
 }
     DurationFlag is a flag with type time.Duration
 
@@ -952,6 +945,8 @@ type Float64Flag struct {
 
 	Aliases []string
 	EnvVars []string
+
+	Action func(*Context, float64) error
 }
     Float64Flag is a flag with type float64
 
@@ -1038,6 +1033,8 @@ type Float64SliceFlag struct {
 
 	Aliases []string
 	EnvVars []string
+
+	Action func(*Context, []float64) error
 }
     Float64SliceFlag is a flag with type *Float64Slice
 
@@ -1071,6 +1068,9 @@ func (f *Float64SliceFlag) IsRequired() bool
 func (f *Float64SliceFlag) IsSet() bool
     IsSet returns whether or not the flag has been set through env or file
 
+func (f *Float64SliceFlag) IsSliceFlag() bool
+    IsSliceFlag implements DocGenerationSliceFlag.
+
 func (f *Float64SliceFlag) IsVisible() bool
     IsVisible returns true if the flag is not hidden, otherwise false
 
@@ -1115,6 +1115,8 @@ type GenericFlag struct {
 	EnvVars []string
 
 	TakesFile bool
+
+	Action func(*Context, interface{}) error
 }
     GenericFlag is a flag with type Generic
 
@@ -1181,6 +1183,8 @@ type Int64Flag struct {
 	EnvVars []string
 
 	Base int
+
+	Action func(*Context, int64) error
 }
     Int64Flag is a flag with type int64
 
@@ -1267,6 +1271,8 @@ type Int64SliceFlag struct {
 
 	Aliases []string
 	EnvVars []string
+
+	Action func(*Context, []int64) error
 }
     Int64SliceFlag is a flag with type *Int64Slice
 
@@ -1300,6 +1306,9 @@ func (f *Int64SliceFlag) IsRequired() bool
 func (f *Int64SliceFlag) IsSet() bool
     IsSet returns whether or not the flag has been set through env or file
 
+func (f *Int64SliceFlag) IsSliceFlag() bool
+    IsSliceFlag implements DocGenerationSliceFlag.
+
 func (f *Int64SliceFlag) IsVisible() bool
     IsVisible returns true if the flag is not hidden, otherwise false
 
@@ -1338,6 +1347,8 @@ type IntFlag struct {
 	EnvVars []string
 
 	Base int
+
+	Action func(*Context, int) error
 }
     IntFlag is a flag with type int
 
@@ -1428,6 +1439,8 @@ type IntSliceFlag struct {
 
 	Aliases []string
 	EnvVars []string
+
+	Action func(*Context, []int) error
 }
     IntSliceFlag is a flag with type *IntSlice
 
@@ -1461,6 +1474,9 @@ func (f *IntSliceFlag) IsRequired() bool
 func (f *IntSliceFlag) IsSet() bool
     IsSet returns whether or not the flag has been set through env or file
 
+func (f *IntSliceFlag) IsSliceFlag() bool
+    IsSliceFlag implements DocGenerationSliceFlag.
+
 func (f *IntSliceFlag) IsVisible() bool
     IsVisible returns true if the flag is not hidden, otherwise false
 
@@ -1533,6 +1549,8 @@ type PathFlag struct {
 	EnvVars []string
 
 	TakesFile bool
+
+	Action func(*Context, Path) error
 }
     PathFlag is a flag with type Path
 
@@ -1673,6 +1691,8 @@ type StringFlag struct {
 	EnvVars []string
 
 	TakesFile bool
+
+	Action func(*Context, string) error
 }
     StringFlag is a flag with type string
 
@@ -1761,6 +1781,8 @@ type StringSliceFlag struct {
 	EnvVars []string
 
 	TakesFile bool
+
+	Action func(*Context, []string) error
 }
     StringSliceFlag is a flag with type *StringSlice
 
@@ -1794,6 +1816,9 @@ func (f *StringSliceFlag) IsRequired() bool
 func (f *StringSliceFlag) IsSet() bool
     IsSet returns whether or not the flag has been set through env or file
 
+func (f *StringSliceFlag) IsSliceFlag() bool
+    IsSliceFlag implements DocGenerationSliceFlag.
+
 func (f *StringSliceFlag) IsVisible() bool
     IsVisible returns true if the flag is not hidden, otherwise false
 
@@ -1867,6 +1892,8 @@ type TimestampFlag struct {
 	Layout string
 
 	Timezone *time.Location
+
+	Action func(*Context, *time.Time) error
 }
     TimestampFlag is a flag with type *Timestamp
 
@@ -1932,6 +1959,8 @@ type Uint64Flag struct {
 	EnvVars []string
 
 	Base int
+
+	Action func(*Context, uint64) error
 }
     Uint64Flag is a flag with type uint64
 
@@ -2018,6 +2047,8 @@ type Uint64SliceFlag struct {
 
 	Aliases []string
 	EnvVars []string
+
+	Action func(*Context, []uint64) error
 }
     Uint64SliceFlag is a flag with type *Uint64Slice
 
@@ -2049,6 +2080,9 @@ func (f *Uint64SliceFlag) IsRequired() bool
 func (f *Uint64SliceFlag) IsSet() bool
     IsSet returns whether or not the flag has been set through env or file
 
+func (f *Uint64SliceFlag) IsSliceFlag() bool
+    IsSliceFlag implements DocGenerationSliceFlag.
+
 func (f *Uint64SliceFlag) IsVisible() bool
     IsVisible returns true if the flag is not hidden, otherwise false
 
@@ -2080,6 +2114,8 @@ type UintFlag struct {
 	EnvVars []string
 
 	Base int
+
+	Action func(*Context, uint) error
 }
     UintFlag is a flag with type uint
 
@@ -2170,6 +2206,8 @@ type UintSliceFlag struct {
 
 	Aliases []string
 	EnvVars []string
+
+	Action func(*Context, []uint) error
 }
     UintSliceFlag is a flag with type *UintSlice
 
@@ -2201,6 +2239,9 @@ func (f *UintSliceFlag) IsRequired() bool
 func (f *UintSliceFlag) IsSet() bool
     IsSet returns whether or not the flag has been set through env or file
 
+func (f *UintSliceFlag) IsSliceFlag() bool
+    IsSliceFlag implements DocGenerationSliceFlag.
+
 func (f *UintSliceFlag) IsVisible() bool
     IsVisible returns true if the flag is not hidden, otherwise false
 
diff --git a/vendor/github.com/urfave/cli/v2/help.go b/vendor/github.com/urfave/cli/v2/help.go
index ba5f80317..293016562 100644
--- a/vendor/github.com/urfave/cli/v2/help.go
+++ b/vendor/github.com/urfave/cli/v2/help.go
@@ -358,6 +358,17 @@ func printHelpCustom(out io.Writer, templ string, data interface{}, customFuncs
 
 	w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0)
 	t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
+	t.New("helpNameTemplate").Parse(helpNameTemplate)
+	t.New("usageTemplate").Parse(usageTemplate)
+	t.New("descriptionTemplate").Parse(descriptionTemplate)
+	t.New("visibleCommandTemplate").Parse(visibleCommandTemplate)
+	t.New("copyrightTemplate").Parse(copyrightTemplate)
+	t.New("versionTemplate").Parse(versionTemplate)
+	t.New("visibleFlagCategoryTemplate").Parse(visibleFlagCategoryTemplate)
+	t.New("visibleFlagTemplate").Parse(visibleFlagTemplate)
+	t.New("visibleGlobalFlagCategoryTemplate").Parse(strings.Replace(visibleFlagCategoryTemplate, "OPTIONS", "GLOBAL OPTIONS", -1))
+	t.New("authorsTemplate").Parse(authorsTemplate)
+	t.New("visibleCommandCategoryTemplate").Parse(visibleCommandCategoryTemplate)
 
 	err := t.Execute(w, data)
 	if err != nil {
@@ -468,25 +479,28 @@ func nindent(spaces int, v string) string {
 }
 
 func wrap(input string, offset int, wrapAt int) string {
-	var sb strings.Builder
+	var ss []string
 
 	lines := strings.Split(input, "\n")
 
 	padding := strings.Repeat(" ", offset)
 
 	for i, line := range lines {
-		if i != 0 {
-			sb.WriteString(padding)
-		}
+		if line == "" {
+			ss = append(ss, line)
+		} else {
+			wrapped := wrapLine(line, offset, wrapAt, padding)
+			if i == 0 {
+				ss = append(ss, wrapped)
+			} else {
+				ss = append(ss, padding+wrapped)
 
-		sb.WriteString(wrapLine(line, offset, wrapAt, padding))
+			}
 
-		if i != len(lines)-1 {
-			sb.WriteString("\n")
 		}
 	}
 
-	return sb.String()
+	return strings.Join(ss, "\n")
 }
 
 func wrapLine(input string, offset int, wrapAt int, padding string) string {
diff --git a/vendor/github.com/urfave/cli/v2/parse.go b/vendor/github.com/urfave/cli/v2/parse.go
index a2db306e1..d79f15a18 100644
--- a/vendor/github.com/urfave/cli/v2/parse.go
+++ b/vendor/github.com/urfave/cli/v2/parse.go
@@ -46,7 +46,10 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple
 			}
 
 			// swap current argument with the split version
-			args = append(args[:i], append(shortOpts, args[i+1:]...)...)
+			// do not include args that parsed correctly so far as it would
+			// trigger Value.Set() on those args and would result in
+			// duplicates for slice type flags
+			args = append(shortOpts, args[i+1:]...)
 			argsWereSplit = true
 			break
 		}
@@ -56,13 +59,6 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple
 		if !argsWereSplit {
 			return err
 		}
-
-		// Since custom parsing failed, replace the flag set before retrying
-		newSet, err := ip.newFlagSet()
-		if err != nil {
-			return err
-		}
-		*set = *newSet
 	}
 }
 
diff --git a/vendor/github.com/urfave/cli/v2/template.go b/vendor/github.com/urfave/cli/v2/template.go
index 9e13604f3..5c2a62e89 100644
--- a/vendor/github.com/urfave/cli/v2/template.go
+++ b/vendor/github.com/urfave/cli/v2/template.go
@@ -1,10 +1,38 @@
 package cli
 
+var helpNameTemplate = `{{$v := offset .HelpName 6}}{{wrap .HelpName 3}}{{if .Usage}} - {{wrap .Usage $v}}{{end}}`
+var usageTemplate = `{{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}`
+var descriptionTemplate = `{{wrap .Description 3}}`
+var authorsTemplate = `{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
+   {{range $index, $author := .Authors}}{{if $index}}
+   {{end}}{{$author}}{{end}}`
+var visibleCommandTemplate = `{{ $cv := offsetCommands .VisibleCommands 5}}{{range .VisibleCommands}}
+   {{$s := join .Names ", "}}{{$s}}{{ $sp := subtract $cv (offset $s 3) }}{{ indent $sp ""}}{{wrap .Usage $cv}}{{end}}`
+var visibleCommandCategoryTemplate = `{{range .VisibleCategories}}{{if .Name}}
+   {{.Name}}:{{range .VisibleCommands}}
+     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{template "visibleCommandTemplate" .}}{{end}}{{end}}`
+var visibleFlagCategoryTemplate = `{{range .VisibleFlagCategories}}
+   {{if .Name}}{{.Name}}
+
+   {{end}}{{$flglen := len .Flags}}{{range $i, $e := .Flags}}{{if eq (subtract $flglen $i) 1}}{{$e}}
+{{else}}{{$e}}
+   {{end}}{{end}}{{end}}`
+
+var visibleFlagTemplate = `{{range $i, $e := .VisibleFlags}}
+   {{wrap $e.String 6}}{{end}}`
+
+var versionTemplate = `{{if .Version}}{{if not .HideVersion}}
+
+VERSION:
+   {{.Version}}{{end}}{{end}}`
+
+var copyrightTemplate = `{{wrap .Copyright 3}}`
+
 // AppHelpTemplate is the text template for the Default help topic.
 // cli.go uses text/template to render templates. You can
 // render custom help text by setting this variable.
 var AppHelpTemplate = `NAME:
-   {{$v := offset .Name 6}}{{wrap .Name 3}}{{if .Usage}} - {{wrap .Usage $v}}{{end}}
+   {{template "helpNameTemplate" .}}
 
 USAGE:
    {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}
@@ -13,72 +41,58 @@ VERSION:
    {{.Version}}{{end}}{{end}}{{if .Description}}
 
 DESCRIPTION:
-   {{wrap .Description 3}}{{end}}{{if len .Authors}}
+   {{template "descriptionTemplate" .}}{{end}}
+{{- if len .Authors}}
 
-AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
-   {{range $index, $author := .Authors}}{{if $index}}
-   {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
+AUTHOR{{template "authorsTemplate" .}}{{end}}{{if .VisibleCommands}}
 
-COMMANDS:{{range .VisibleCategories}}{{if .Name}}
-   {{.Name}}:{{range .VisibleCommands}}
-     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{ $cv := offsetCommands .VisibleCommands 5}}{{range .VisibleCommands}}
-   {{$s := join .Names ", "}}{{$s}}{{ $sp := subtract $cv (offset $s 3) }}{{ indent $sp ""}}{{wrap .Usage $cv}}{{end}}{{end}}{{end}}{{end}}{{if .VisibleFlagCategories}}
+COMMANDS:{{template "visibleCommandCategoryTemplate" .}}{{end}}{{if .VisibleFlagCategories}}
 
-GLOBAL OPTIONS:{{range .VisibleFlagCategories}}
-   {{if .Name}}{{.Name}}
-   {{end}}{{range .Flags}}{{.}}
-   {{end}}{{end}}{{else}}{{if .VisibleFlags}}
+GLOBAL OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}}
 
-GLOBAL OPTIONS:
-   {{range $index, $option := .VisibleFlags}}{{if $index}}
-   {{end}}{{wrap $option.String 6}}{{end}}{{end}}{{end}}{{if .Copyright}}
+GLOBAL OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}{{if .Copyright}}
 
 COPYRIGHT:
-   {{wrap .Copyright 3}}{{end}}
+   {{template "copyrightTemplate" .}}{{end}}
 `
 
 // CommandHelpTemplate is the text template for the command help topic.
 // cli.go uses text/template to render templates. You can
 // render custom help text by setting this variable.
 var CommandHelpTemplate = `NAME:
-   {{$v := offset .HelpName 6}}{{wrap .HelpName 3}}{{if .Usage}} - {{wrap .Usage $v}}{{end}}
+   {{template "helpNameTemplate" .}}
 
 USAGE:
-   {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}}
+   {{template "usageTemplate" .}}{{if .Category}}
 
 CATEGORY:
    {{.Category}}{{end}}{{if .Description}}
 
 DESCRIPTION:
-   {{wrap .Description 3}}{{end}}{{if .VisibleFlagCategories}}
+   {{template "descriptionTemplate" .}}{{end}}{{if .VisibleFlagCategories}}
 
-OPTIONS:{{range .VisibleFlagCategories}}
-   {{if .Name}}{{.Name}}
-   {{end}}{{range .Flags}}{{.}}{{end}}{{end}}{{else}}{{if .VisibleFlags}}
+OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}}
 
-OPTIONS:
-   {{range .VisibleFlags}}{{.}}{{end}}{{end}}{{end}}
+OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}
 `
 
 // SubcommandHelpTemplate is the text template for the subcommand help topic.
 // cli.go uses text/template to render templates. You can
 // render custom help text by setting this variable.
 var SubcommandHelpTemplate = `NAME:
-   {{.HelpName}} - {{.Usage}}
+   {{template "helpNameTemplate" .}}
 
 USAGE:
    {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Description}}
 
 DESCRIPTION:
-   {{wrap .Description 3}}{{end}}
+   {{template "descriptionTemplate" .}}{{end}}{{if .VisibleCommands}}
 
-COMMANDS:{{range .VisibleCategories}}{{if .Name}}
-   {{.Name}}:{{range .VisibleCommands}}
-     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{ $cv := offsetCommands .VisibleCommands 5}}{{range .VisibleCommands}}
-     {{$s := join .Names ", "}}{{$s}}{{ $sp := subtract $cv (offset $s 3) }}{{ indent $sp ""}}{{wrap .Usage $cv}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
+COMMANDS:{{template "visibleCommandTemplate" .}}{{end}}{{if .VisibleFlagCategories}}
+
+OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}}
 
-OPTIONS:
-   {{range .VisibleFlags}}{{.}}{{end}}{{end}}
+OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}
 `
 
 var MarkdownDocTemplate = `{{if gt .SectionNum 0}}% {{ .App.Name }} {{ .SectionNum }}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 3bb7296df..42c259243 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -37,10 +37,9 @@ github.com/acobaugh/osrelease
 # github.com/acomagu/bufpipe v1.0.3
 ## explicit; go 1.12
 github.com/acomagu/bufpipe
-# github.com/aquasecurity/libbpfgo v0.4.0-libbpf-1.0.0
+# github.com/aquasecurity/libbpfgo v0.4.1-libbpf-1.0.0
 ## explicit; go 1.18
 github.com/aquasecurity/libbpfgo
-github.com/aquasecurity/libbpfgo/helpers/rwarray
 # github.com/aws/aws-sdk-go v1.44.111
 ## explicit; go 1.11
 github.com/aws/aws-sdk-go/aws
@@ -567,7 +566,7 @@ github.com/spf13/pflag
 github.com/stretchr/testify/assert
 github.com/stretchr/testify/require
 github.com/stretchr/testify/suite
-# github.com/urfave/cli/v2 v2.17.1
+# github.com/urfave/cli/v2 v2.19.2
 ## explicit; go 1.18
 github.com/urfave/cli/v2
 # github.com/vbatts/tar-split v0.11.2


Test patch:
diff --git a/test/tc_profilerecordings_test.go b/test/tc_profilerecordings_test.go
index a04372db2..17ff4a711 100644
--- a/test/tc_profilerecordings_test.go
+++ b/test/tc_profilerecordings_test.go
@@ -287,27 +287,13 @@ func (e *e2e) testCaseRecordingFinalizers() {
 	output := e.kubectl("get", "profilerecording", recordingName, "--output", "jsonpath={.metadata.finalizers[0]}")
 	e.Equal("active-seccomp-profile-recording-lock", output)
 
-	// Attempt to delete the resource, should not be possible
-	e.kubectl("delete", "--wait=false", "profilerecording", recordingName)
-	output = e.kubectl("get", "profilerecording", recordingName, "--output", "jsonpath={.metadata.deletionTimestamp}")
-	e.NotEmpty(output)
-
-	isDeleted := make(chan bool)
-	go func() {
-		e.waitFor("delete", "profilerecording", recordingName)
-		isDeleted <- true
-	}()
-
 	// Delete the pod and check that the resource is removed
 	e.kubectl("delete", "pod", podName)
 
-	// Wait a bit for the recording to be actually deleted
-	<-isDeleted
-
 	resourceName := recordingName + "-nginx"
 	profile := e.retryGetSeccompProfile(resourceName)
 	e.Contains(profile, "listen")
-
+	e.kubectl("delete", "-f", exampleRecordingSeccompLogsPath)
 	e.kubectl("delete", "sp", resourceName)
 }
 
diff --git a/test/tc_seccomp_profilebindings_test.go b/test/tc_seccomp_profilebindings_test.go
index 4ceec4ed0..5e7ef78b1 100644
--- a/test/tc_seccomp_profilebindings_test.go
+++ b/test/tc_seccomp_profilebindings_test.go
@@ -47,6 +47,13 @@ spec:
   - image: quay.io/security-profiles-operator/test-hello-world:latest
     name: hello
     resources: {}
+    securityContext:
+      allowPrivilegeEscalation: false
+      capabilities:
+        drop:
+        - ALL
+      runAsUser: 1000
+      runAsNonRoot: true
   restartPolicy: Never
 `