From 2365cc1dde19cd4d7326769f77fd753421c413ed Mon Sep 17 00:00:00 2001 From: Alexandre Date: Tue, 7 Dec 2021 14:26:36 +0100 Subject: [PATCH] Addition of arpspoof --- README.md | 1 + arpspoof/CHANGELOG.md | 1 + arpspoof/Dockerfile | 58 ++++++++++++++++++ arpspoof/Readme.md | 56 +++++++++++++++++ arpspoof/apparmor.txt | 48 +++++++++++++++ arpspoof/config.json | 33 ++++++++++ arpspoof/icon.png | Bin 0 -> 28790 bytes arpspoof/logo.png | Bin 0 -> 28790 bytes arpspoof/rootfs/entrypoint.sh | 44 +++++++++++++ .../scripts/00-aaa_dockerfile_backup.sh | 29 +++++++++ arpspoof/rootfs/scripts/00-banner.sh | 39 ++++++++++++ arpspoof/rootfs/scripts/00-global_var.sh | 31 ++++++++++ arpspoof/rootfs/scripts/99-run.sh | 4 ++ 13 files changed, 344 insertions(+) create mode 100644 arpspoof/CHANGELOG.md create mode 100644 arpspoof/Dockerfile create mode 100644 arpspoof/Readme.md create mode 100644 arpspoof/apparmor.txt create mode 100644 arpspoof/config.json create mode 100644 arpspoof/icon.png create mode 100644 arpspoof/logo.png create mode 100644 arpspoof/rootfs/entrypoint.sh create mode 100644 arpspoof/rootfs/scripts/00-aaa_dockerfile_backup.sh create mode 100644 arpspoof/rootfs/scripts/00-banner.sh create mode 100644 arpspoof/rootfs/scripts/00-global_var.sh create mode 100644 arpspoof/rootfs/scripts/99-run.sh diff --git a/README.md b/README.md index 25e1b1c54..2913bd08b 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ https://github.com/alexbelgium/hassio-addons ## ✓ Misc tools - [Addons Updater](addons_updater/) ![support][support-shield] : Automatic addons update by aligning version tag with github upstream releases +- [Arpspoof](arpspoof/): adds ability to block internet connection for local network devices - [Code-server](code-server/) : Code-server is VS Code running on a remote server, accessible through the browser. - [Inadyn](inadyn/) : Inadyn, or In-a-Dyn, is a small and simple Dynamic DNS, DDNS, client with HTTPS support. Commonly available in many GNU/Linux distributions, used in off the shelf routers and Internet gateways to automate the task of keeping your Internet name in sync with your public¹ IP address. It can also be used in installations with redundant (backup) connections to the Internet. - [Portainer](portainer/) ![privileged][privileged-shield] ![ingress][ingress-shield] : Manage your docker environment diff --git a/arpspoof/CHANGELOG.md b/arpspoof/CHANGELOG.md new file mode 100644 index 000000000..66f7e8b76 --- /dev/null +++ b/arpspoof/CHANGELOG.md @@ -0,0 +1 @@ +- Initial release diff --git a/arpspoof/Dockerfile b/arpspoof/Dockerfile new file mode 100644 index 000000000..143ab9566 --- /dev/null +++ b/arpspoof/Dockerfile @@ -0,0 +1,58 @@ +ARG BUILD_FROM +ARG BUILD_VERSION +FROM techblog/arpspoof-docker:latest +ENV BASHIO_VERSION=0.14.3 +ENV PACKAGES="jq \ + curl" + +RUN \ + ################ + # Install apps # + ################ + apt-get clean \ + && apt-get update \ + && apt-get install -y ${PACKAGES} \ + \ + ################### + # Install bashio # + ################## + && mkdir -p /tmp/bashio \ + && curl -L -f -s "https://github.com/hassio-addons/bashio/archive/v${BASHIO_VERSION}.tar.gz" \ + | tar -xzf - --strip 1 -C /tmp/bashio \ + && mv /tmp/bashio/lib /usr/lib/bashio \ + && ln -s /usr/lib/bashio/bashio /usr/bin/bashio \ + && rm -rf /tmp/bashio || true + +# copy local files +COPY rootfs/ / +#WORKDIR / +RUN chmod 777 /entrypoint.sh +ENTRYPOINT [ "/usr/bin/env" ] +CMD [ "/entrypoint.sh" ] + +### LABELS +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION +LABEL \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Add-ons" \ + org.opencontainers.image.authors="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://github.com/alexbelgium" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} diff --git a/arpspoof/Readme.md b/arpspoof/Readme.md new file mode 100644 index 000000000..0f0cc15e6 --- /dev/null +++ b/arpspoof/Readme.md @@ -0,0 +1,56 @@ +# Home assistant add-on: Arpspoof + +[![Donate][donation-badge]](https://www.buymeacoffee.com/alexbelgium) + +[donation-badge]: https://img.shields.io/badge/Buy%20me%20a%20coffee-%23d32f2f?logo=buy-me-a-coffee&style=flat&logoColor=white + +![Supports + Architecture][aarch64-shield] ![Supports amd64 Architecture][amd64-shield] ![Supports armhf Architecture][armhf-shield] ![Supports armv7 Architecture][armv7-shield] +![Supports smb mounts][smb-shield] + +_Thanks to everyone having starred my repo! To star it click on the image below, then it will be on top right. Thanks!_ + +[![Stargazers repo roster for @alexbelgium/hassio-addons](https://reporoster.com/stars/alexbelgium/hassio-addons)](https://github.com/alexbelgium/hassio-addons/stargazers) + +## About + +[arpspoof](https://github.com/t0mer/Arpspoof-Docker) adds ability to block internet connection for local network devices +This addon is based on the docker image https://hub.docker.com/r/techblog/arpspoof-docker + +## Installation + +The installation of this add-on is pretty straightforward and not different in comparison to installing any other add-on. + +1. Add my add-ons repository to your home assistant instance (in supervisor addons store at top right, or click button below if you have configured my HA) + [![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) +1. Install this add-on. +1. Click the `Save` button to store your configuration. +1. Set the add-on options to your preferences +1. Start the add-on. +1. Check the logs of the add-on to see if everything went well. +1. Open the webUI and adapt the software options + +## Configuration + +Webui can be found at . + + +```yaml +ROUTER_IP: 127.0.0.1 #Required Router IP +INTERFACE_NAME: name #Required Interface name, can use this command to get it: ip route get 8.8.8.8 | sed -nr 's/.*dev ([^\ ]+).*/\1/p' +``` + +## Support + +Create an issue on github + +## Illustration + +NO illustration + +[repository]: https://github.com/alexbelgium/hassio-addons +[smb-shield]: https://img.shields.io/badge/smb-yes-green.svg +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg diff --git a/arpspoof/apparmor.txt b/arpspoof/apparmor.txt new file mode 100644 index 000000000..f1c902851 --- /dev/null +++ b/arpspoof/apparmor.txt @@ -0,0 +1,48 @@ +#include + +profile arpspoof_addon flags=(attach_disconnected,mediate_deleted) { + #include + + capability, + file, + mount, + umount, + remount, + + capability setgid, + capability setuid, + capability sys_admin, + capability dac_read_search, + # capability dac_override, + # capability sys_rawio, + +# S6-Overlay + /bin/** ix, + /usr/bin/** ix, + /usr/lib/bashio/** ix, + /etc/s6/** rix, + /run/s6/** rix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /init rix, + /var/run/** mrwkl, + /var/run/ mrwkl, + /dev/i2c-1 mrwkl, + # Files required + /dev/sda1 mrwkl, + /dev/sdb1 mrwkl, + /dev/mmcblk0p1 mrwkl, + /dev/* mrwkl, + /tmp/** mrkwl, + + # Data access + /data/** rw, + + # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container + ptrace (trace,read) peer=docker-default, + + # docker daemon confinement requires explict allow rule for signal + signal (receive) set=(kill,term) peer=/usr/bin/docker, + +} diff --git a/arpspoof/config.json b/arpspoof/config.json new file mode 100644 index 000000000..dbd38e118 --- /dev/null +++ b/arpspoof/config.json @@ -0,0 +1,33 @@ +{ + "apparmor": true, + "arch": ["aarch64", "amd64", "armv7", "armhf"], + "boot": "auto", + "description": "block internet connection for local network devices", + "devices": [ + ], + "environment": { + }, + "map": [], + "host_network": true, + "name": "Arpspoof", + "options": { + "ROUTER_IP": "yourip", + "INTERFACE_NAME": "interface name" + }, + "ports": { + "7022/tcp": 7022 + }, + "ports_description": { + "7022/tcp": "web interface" + }, + "privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"], + "schema": { + "ROUTER_IP": "str", + "INTERFACE_NAME": "str" + }, + "slug": "arpspoof", + "upstream": "1.0", + "url": "https://github.com/alexbelgium/hassio-addons", + "version": "1.0", + "webui": "http://[HOST]:[PORT:7022]" +} diff --git a/arpspoof/icon.png b/arpspoof/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca24c94daf8952468a6f588ead1bbfdbe0617f GIT binary patch literal 28790 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 literal 0 HcmV?d00001 diff --git a/arpspoof/logo.png b/arpspoof/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca24c94daf8952468a6f588ead1bbfdbe0617f GIT binary patch literal 28790 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 literal 0 HcmV?d00001 diff --git a/arpspoof/rootfs/entrypoint.sh b/arpspoof/rootfs/entrypoint.sh new file mode 100644 index 000000000..635dbc865 --- /dev/null +++ b/arpspoof/rootfs/entrypoint.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +echo "Starting..." + +################################### +# Export all addon options as env # +################################### + +# For all keys in options.json +JSONSOURCE="/data/options.json" + +# Export keys as env variables +echo "All addon options were exported as variables" +mapfile -t arr < <(jq -r 'keys[]' ${JSONSOURCE}) +for KEYS in ${arr[@]}; do + # export key + VALUE=$(jq .$KEYS ${JSONSOURCE}) + export ${KEYS}=${VALUE//[\"\']/} &>/dev/null +done + +################ +# Set timezone # +################ +if [ ! -z "TZ" ] && [ -f /etc/localtime ]; then + if [ -f /usr/share/zoneinfo/$TZ ]; then + echo "Timezone set from $(cat /etc/timezone) to $TZ" + ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone + else + echo "WARNING : Timezone $TZ is invalid, it will be kept to default value of $(cat /etc/timezone)" + fi +fi + +#################### +# Starting scripts # +#################### + +for SCRIPTS in scripts/*; do + [ -e "$SCRIPTS" ] || continue + echo "$SCRIPTS: executing" + chown $(id -u):$(id -g) $SCRIPTS + chmod a+x $SCRIPTS + sed -i 's|/usr/bin/with-contenv bashio|/usr/bin/env bashio|g' $SCRIPTS || true + ./$SCRIPTS || echo "$SCRIPTS: exiting $?" +done diff --git a/arpspoof/rootfs/scripts/00-aaa_dockerfile_backup.sh b/arpspoof/rootfs/scripts/00-aaa_dockerfile_backup.sh new file mode 100644 index 000000000..d036f5468 --- /dev/null +++ b/arpspoof/rootfs/scripts/00-aaa_dockerfile_backup.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# If dockerfile failed install manually +if [ ! -f "/usr/bin/bashio" ]; then + echo "Bashio does not exist, executing script" + ( + ################ + # Install apps # + ################ + PACKAGES="${PACKAGES:="curl"}" + + apt-get clean \ + && apt-get update \ + && apt-get install -y $PACKAGES 2>/dev/null \ + || apk add --no-cache $PACKAGES + + ################### + # Install bashio # + ################## + + mkdir -p /tmp/bashio + curl -L -f -s "https://github.com/hassio-addons/bashio/archive/v${BASHIO_VERSION}.tar.gz" | + tar -xzf - --strip 1 -C /tmp/bashio + mv /tmp/bashio/lib /usr/lib/bashio + ln -s /usr/lib/bashio/bashio /usr/bin/bashio + rm -rf /tmp/bashio + + ) >/dev/null + +fi diff --git a/arpspoof/rootfs/scripts/00-banner.sh b/arpspoof/rootfs/scripts/00-banner.sh new file mode 100644 index 000000000..0ac294e9a --- /dev/null +++ b/arpspoof/rootfs/scripts/00-banner.sh @@ -0,0 +1,39 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Displays a simple add-on banner on startup +# ============================================================================== + +if bashio::supervisor.ping; then + bashio::log.blue \ + '-----------------------------------------------------------' + bashio::log.blue " Add-on: $(bashio::addon.name)" + bashio::log.blue " $(bashio::addon.description)" + bashio::log.blue \ + '-----------------------------------------------------------' + + bashio::log.blue " Add-on version: $(bashio::addon.version)" + if bashio::var.true "$(bashio::addon.update_available)"; then + bashio::log.magenta ' There is an update available for this add-on!' + bashio::log.magenta \ + " Latest add-on version: $(bashio::addon.version_latest)" + bashio::log.magenta ' Please consider upgrading as soon as possible.' + else + bashio::log.green ' You are running the latest version of this add-on.' + fi + + bashio::log.blue " System: $(bashio::info.operating_system)" \ + " ($(bashio::info.arch) / $(bashio::info.machine))" + bashio::log.blue " Home Assistant Core: $(bashio::info.homeassistant)" + bashio::log.blue " Home Assistant Supervisor: $(bashio::info.supervisor)" + + bashio::log.blue \ + '-----------------------------------------------------------' + bashio::log.blue \ + ' Please, share the above information when looking for help' + bashio::log.blue \ + ' or support in, e.g., GitHub, forums' + bashio::log.green \ + ' https://github.com/alexbelgium/hassio-addons' + bashio::log.blue \ + '-----------------------------------------------------------' +fi diff --git a/arpspoof/rootfs/scripts/00-global_var.sh b/arpspoof/rootfs/scripts/00-global_var.sh new file mode 100644 index 000000000..448527a43 --- /dev/null +++ b/arpspoof/rootfs/scripts/00-global_var.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +################################### +# Export all addon options as env # +################################### + +# For all keys in options.json +JSONSOURCE="/data/options.json" + +# Export keys as env variables +# echo "All addon options were exported as variables" +mapfile -t arr < <(jq -r 'keys[]' ${JSONSOURCE}) +for KEYS in ${arr[@]}; do + # export key + VALUE=$(jq .$KEYS ${JSONSOURCE}) + line="${KEYS}=${VALUE//[\"\']/} &>/dev/null" + # Use locally + export $line + # Export the variable to run scripts + sed -i "1a export $line" /etc/services.d/*/*run* 2>/dev/null || sed -i "1a export $line" /scripts/*run* +done + +################ +# Set timezone # +################ +if [ ! -z "TZ" ] && [ -f /etc/localtime ]; then + if [ -f /usr/share/zoneinfo/$TZ ]; then + echo "Timezone set from $(cat /etc/timezone) to $TZ" + ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone + fi +fi diff --git a/arpspoof/rootfs/scripts/99-run.sh b/arpspoof/rootfs/scripts/99-run.sh new file mode 100644 index 000000000..58a8ddd23 --- /dev/null +++ b/arpspoof/rootfs/scripts/99-run.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bashio + +bashio::log.info "Starting..." +/usr/bin/python3 /opt/arpspoof/arpspoof.py \ No newline at end of file