From 4d6bc4b6c341d4b0ec108ee22f7fe4b29f12eeee Mon Sep 17 00:00:00 2001 From: Alban Crequy Date: Mon, 25 Mar 2024 15:28:07 +0100 Subject: [PATCH] Artifact Hub: publish gadgets Signed-off-by: Alban Crequy --- README.md | 1 + artifacthub-repo.yml | 7 +++++ docs/devel/hello-world-gadget.md | 4 +++ gadgets/ci/sched_cls_drop/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/snapshot_process/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/snapshot_socket/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/top_file/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_dns/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_exec/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_malloc/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_mount/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_oomkill/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_open/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_signal/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_sni/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_tcp/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_tcpconnect/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_tcpdrop/artifacthub-pkg.yml | 28 +++++++++++++++++++ gadgets/trace_tcpretrans/artifacthub-pkg.yml | 28 +++++++++++++++++++ 19 files changed, 460 insertions(+) create mode 100644 artifacthub-repo.yml create mode 100644 gadgets/ci/sched_cls_drop/artifacthub-pkg.yml create mode 100644 gadgets/snapshot_process/artifacthub-pkg.yml create mode 100644 gadgets/snapshot_socket/artifacthub-pkg.yml create mode 100644 gadgets/top_file/artifacthub-pkg.yml create mode 100644 gadgets/trace_dns/artifacthub-pkg.yml create mode 100644 gadgets/trace_exec/artifacthub-pkg.yml create mode 100644 gadgets/trace_malloc/artifacthub-pkg.yml create mode 100644 gadgets/trace_mount/artifacthub-pkg.yml create mode 100644 gadgets/trace_oomkill/artifacthub-pkg.yml create mode 100644 gadgets/trace_open/artifacthub-pkg.yml create mode 100644 gadgets/trace_signal/artifacthub-pkg.yml create mode 100644 gadgets/trace_sni/artifacthub-pkg.yml create mode 100644 gadgets/trace_tcp/artifacthub-pkg.yml create mode 100644 gadgets/trace_tcpconnect/artifacthub-pkg.yml create mode 100644 gadgets/trace_tcpdrop/artifacthub-pkg.yml create mode 100644 gadgets/trace_tcpretrans/artifacthub-pkg.yml diff --git a/README.md b/README.md index 080de09ab95..5f69181f5cb 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ [![Inspektor Gadget Test Reports](https://img.shields.io/badge/Link-Test%20Reports-blue)](https://inspektor-gadget.github.io/ig-test-reports) [![Inspektor Gadget Benchmarks](https://img.shields.io/badge/Link-Benchmarks-blue)](https://inspektor-gadget.github.io/ig-benchmarks/dev/bench) [![Release](https://img.shields.io/github/v/release/inspektor-gadget/inspektor-gadget)](https://github.com/inspektor-gadget/inspektor-gadget/releases) +[![Artifact Hub: Gadgets](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/gadgets)](https://artifacthub.io/packages/search?repo=inspektor-gadgets) [![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/gadget)](https://artifacthub.io/packages/search?repo=gadget) [![Slack](https://img.shields.io/badge/slack-%23inspektor--gadget-brightgreen.svg?logo=slack)](https://kubernetes.slack.com/messages/inspektor-gadget/) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/inspektor-gadget/inspektor-gadget/blob/main/LICENSE) diff --git a/artifacthub-repo.yml b/artifacthub-repo.yml new file mode 100644 index 00000000000..973822f4033 --- /dev/null +++ b/artifacthub-repo.yml @@ -0,0 +1,7 @@ +# Artifact Hub repository metadata file +# https://github.com/artifacthub/hub/blob/master/docs/metadata/artifacthub-repo.yml + +repositoryID: a4a4aff7-52f0-43f9-93a5-0749f53bc898 +owners: + - name: The Inspektor Gadget authors + email: hello@inspektor-gadget.io diff --git a/docs/devel/hello-world-gadget.md b/docs/devel/hello-world-gadget.md index 3dbc7725f89..a0bcbf4cdb2 100644 --- a/docs/devel/hello-world-gadget.md +++ b/docs/devel/hello-world-gadget.md @@ -21,6 +21,10 @@ If you want to create a new repository for your gadget, you can use the [gadget- repository](https://github.com/inspektor-gadget/gadget-template). This is a [GitHub tempate repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template). +You can also look for examples in gadgets published on Artifact Hub: + +[![Artifact Hub: Gadgets](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/gadgets)](https://artifacthub.io/packages/search?repo=inspektor-gadgets) + ## Starting from scratch If you already have a git repository for your project and want to add a gadget diff --git a/gadgets/ci/sched_cls_drop/artifacthub-pkg.yml b/gadgets/ci/sched_cls_drop/artifacthub-pkg.yml new file mode 100644 index 00000000000..a9572302a26 --- /dev/null +++ b/gadgets/ci/sched_cls_drop/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "sched_cls_drop" +category: monitoring-logging +displayName: "sched_cls_drop" +createdAt: "2024-03-25T14:32:05+01:00" +description: "gadget used by the CI" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/sched_cls_drop:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/sched_cls_drop:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/snapshot_process/artifacthub-pkg.yml b/gadgets/snapshot_process/artifacthub-pkg.yml new file mode 100644 index 00000000000..c9419282e6a --- /dev/null +++ b/gadgets/snapshot_process/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "snapshot process" +category: monitoring-logging +displayName: "snapshot process" +createdAt: "2024-03-25T14:32:05+01:00" +description: "Show running processes" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/snapshot_process:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/snapshot_process:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/snapshot_socket/artifacthub-pkg.yml b/gadgets/snapshot_socket/artifacthub-pkg.yml new file mode 100644 index 00000000000..0a6aef8e740 --- /dev/null +++ b/gadgets/snapshot_socket/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "snapshot socket" +category: monitoring-logging +displayName: "snapshot socket" +createdAt: "2024-03-25T14:32:05+01:00" +description: "Show TCP and UDP sockets" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/snapshot_socket:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/snapshot_socket:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/top_file/artifacthub-pkg.yml b/gadgets/top_file/artifacthub-pkg.yml new file mode 100644 index 00000000000..f4868eead12 --- /dev/null +++ b/gadgets/top_file/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "top file" +category: monitoring-logging +displayName: "top file" +createdAt: "2024-03-25T14:32:05+01:00" +description: "Periodically report read/write activity by file" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/top_file:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/top_file:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_dns/artifacthub-pkg.yml b/gadgets/trace_dns/artifacthub-pkg.yml new file mode 100644 index 00000000000..096f4b9576a --- /dev/null +++ b/gadgets/trace_dns/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace dns" +category: monitoring-logging +displayName: "trace dns" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace dns requests and responses" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_dns:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_dns:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_exec/artifacthub-pkg.yml b/gadgets/trace_exec/artifacthub-pkg.yml new file mode 100644 index 00000000000..422d31fafa4 --- /dev/null +++ b/gadgets/trace_exec/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace exec" +category: monitoring-logging +displayName: "trace exec" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace process executions" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_exec:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_exec:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_malloc/artifacthub-pkg.yml b/gadgets/trace_malloc/artifacthub-pkg.yml new file mode 100644 index 00000000000..90fbadb7698 --- /dev/null +++ b/gadgets/trace_malloc/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace malloc" +category: monitoring-logging +displayName: "trace malloc" +createdAt: "2024-03-25T14:32:05+01:00" +description: "use uprobe to trace malloc and free in libc.so" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_malloc:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_malloc:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_mount/artifacthub-pkg.yml b/gadgets/trace_mount/artifacthub-pkg.yml new file mode 100644 index 00000000000..12b82066e6f --- /dev/null +++ b/gadgets/trace_mount/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace mount" +category: monitoring-logging +displayName: "trace mount" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace mount syscalls" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_mount:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_mount:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_oomkill/artifacthub-pkg.yml b/gadgets/trace_oomkill/artifacthub-pkg.yml new file mode 100644 index 00000000000..904d4697468 --- /dev/null +++ b/gadgets/trace_oomkill/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace oomkill" +category: monitoring-logging +displayName: "trace oomkill" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace OOM killer" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_oomkill:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_oomkill:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_open/artifacthub-pkg.yml b/gadgets/trace_open/artifacthub-pkg.yml new file mode 100644 index 00000000000..153a2875693 --- /dev/null +++ b/gadgets/trace_open/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace open" +category: monitoring-logging +displayName: "trace open" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace open files" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_open:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_open:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_signal/artifacthub-pkg.yml b/gadgets/trace_signal/artifacthub-pkg.yml new file mode 100644 index 00000000000..c7144c81781 --- /dev/null +++ b/gadgets/trace_signal/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace signal" +category: monitoring-logging +displayName: "trace signal" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace signal" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_signal:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_signal:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_sni/artifacthub-pkg.yml b/gadgets/trace_sni/artifacthub-pkg.yml new file mode 100644 index 00000000000..79cf5fe2969 --- /dev/null +++ b/gadgets/trace_sni/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace sni" +category: monitoring-logging +displayName: "trace sni" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace sni" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_sni:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_sni:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_tcp/artifacthub-pkg.yml b/gadgets/trace_tcp/artifacthub-pkg.yml new file mode 100644 index 00000000000..bce3341fd6f --- /dev/null +++ b/gadgets/trace_tcp/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace tcp" +category: monitoring-logging +displayName: "trace tcp" +createdAt: "2024-03-25T14:32:05+01:00" +description: "monitor connect, accept and close events of TCP connections" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_tcp:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_tcp:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_tcpconnect/artifacthub-pkg.yml b/gadgets/trace_tcpconnect/artifacthub-pkg.yml new file mode 100644 index 00000000000..67436ca2964 --- /dev/null +++ b/gadgets/trace_tcpconnect/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace tcpconnect" +category: monitoring-logging +displayName: "trace tcpconnect" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace tcp connections" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_tcpconnect:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_tcpconnect:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_tcpdrop/artifacthub-pkg.yml b/gadgets/trace_tcpdrop/artifacthub-pkg.yml new file mode 100644 index 00000000000..7c2ce3c23f7 --- /dev/null +++ b/gadgets/trace_tcpdrop/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace tcpdrop" +category: monitoring-logging +displayName: "trace tcpdrop" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace TCP packets dropped by the kernel" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_tcpdrop:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_tcpdrop:latest + ``` +provider: + name: Inspektor Gadget diff --git a/gadgets/trace_tcpretrans/artifacthub-pkg.yml b/gadgets/trace_tcpretrans/artifacthub-pkg.yml new file mode 100644 index 00000000000..7b8010016ee --- /dev/null +++ b/gadgets/trace_tcpretrans/artifacthub-pkg.yml @@ -0,0 +1,28 @@ +# Artifact Hub package metadata file +version: 0.26.0 +name: "trace tcpretrans" +category: monitoring-logging +displayName: "trace tcpretrans" +createdAt: "2024-03-25T14:32:05+01:00" +description: "trace TCP retransmissions" +logoURL: "https://inspektor-gadget.io/media/brand-icon.svg" +license: "" +homeURL: "https://inspektor-gadget.io/" +containersImages: + - name: gadget + image: "ghcr.io/inspektor-gadget/gadget/trace_tcpretrans:latest" + platforms: + - linux/amd64 + - linux/arm64 +keywords: + - gadget +links: + - name: source + url: "https://github.com/inspektor-gadget/inspektor-gadget/" +install: | + # Run + ```bash + sudo IG_EXPERIMENTAL=true ig run ghcr.io/inspektor-gadget/gadget/trace_tcpretrans:latest + ``` +provider: + name: Inspektor Gadget