diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..e236489d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.js linguist-vendored +/Dockerfile linguist-vendored +/release.py linguist-vendored +/**/*.js linguist-vendored \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index f8e81cca..8fad20d9 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: evilsocket patreon: evilsocket open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..05551636 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Bettercap Documentation + url: https://www.bettercap.org/ + about: Please read the instructions before asking for help. diff --git a/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE/default_issue.md similarity index 94% rename from ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE/default_issue.md index 5c23a58c..8fc3c85c 100644 --- a/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE/default_issue.md @@ -1,3 +1,8 @@ +--- +name: General Issue +about: Write a general issue or bug report. +--- + # Prerequisites Please, before creating this issue make sure that you read the [README](https://github.com/bettercap/bettercap/blob/master/README.md), that you are running the [latest stable version](https://github.com/bettercap/bettercap/releases) and that you already searched [other issues](https://github.com/bettercap/bettercap/issues?q=is%3Aopen+is%3Aissue+label%3Abug) to see if your problem or request was already reported. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..c78a0857 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + # GitHub Actions + - package-ecosystem: github-actions + directory: / + schedule: + interval: daily diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml new file mode 100644 index 00000000..a9a770f0 --- /dev/null +++ b/.github/workflows/build-and-deploy.yml @@ -0,0 +1,117 @@ +name: Build and Deploy + +on: + push: + tags: + - 'v*.*.*' # Match version tags + workflow_dispatch: + +jobs: + build: + name: ${{ matrix.os.pretty }} ${{ matrix.arch }} + runs-on: ${{ matrix.os.runs-on }} + strategy: + matrix: + os: + - name: darwin + runs-on: [macos-latest] + pretty: 🍎 macOS + - name: linux + runs-on: [ubuntu-latest] + pretty: 🐧 Linux + - name: windows + runs-on: [windows-latest] + pretty: 🪟 Windows + output: bettercap.exe + arch: [amd64, arm64] + go: [1.24.x] + exclude: + - os: + name: darwin + arch: amd64 + # Linux ARM64 images are not yet publicly available (https://github.com/actions/runner-images) + - os: + name: linux + arch: arm64 + - os: + name: windows + arch: arm64 + + env: + OUTPUT: ${{ matrix.os.output || 'bettercap' }} + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go }} + + - name: Install Dependencies + if: ${{ matrix.os.name == 'linux' }} + run: sudo apt-get update && sudo apt-get install -y p7zip-full libpcap-dev libnetfilter-queue-dev libusb-1.0-0-dev + + - name: Install Dependencies (macOS) + if: ${{ matrix.os.name == 'macos' }} + run: brew install libpcap libusb p7zip + + - name: Install libusb via mingw (Windows) + if: ${{ matrix.os.name == 'windows' }} + uses: msys2/setup-msys2@v2 + with: + install: |- + mingw64/mingw-w64-x86_64-libusb + mingw64/mingw-w64-x86_64-pkg-config + + - name: Install other Dependencies (Windows) + if: ${{ matrix.os.name == 'windows' }} + run: | + choco install openssl.light -y + choco install make -y + choco install 7zip -y + choco install zadig -y + curl -L "https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip" -o "C:\wpcap-sdk.zip" + 7z x -y "C:\wpcap-sdk.zip" -o"C:\winpcap" + echo "D:\a\_temp\msys64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Build + run: make -e TARGET="${{ env.OUTPUT }}" + + - name: Verify Build + run: | + file "${{ env.OUTPUT }}" + openssl dgst -sha256 "${{ env.OUTPUT }}" | tee bettercap_${{ matrix.os.name }}_${{ matrix.arch }}.sha256 + 7z a "bettercap_${{ matrix.os.name }}_${{ matrix.arch }}.zip" "${{ env.OUTPUT }}" "bettercap_${{ matrix.os.name }}_${{ matrix.arch }}.sha256" + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: release-artifacts-${{ matrix.os.name }}-${{ matrix.arch }} + path: | + bettercap_*.zip + bettercap_*.sha256 + + deploy: + needs: [build] + name: Release + runs-on: ubuntu-latest + steps: + - name: Download Artifacts + uses: actions/download-artifact@v5 + with: + pattern: release-artifacts-* + merge-multiple: true + path: dist/ + + - name: Release Assets + run: ls -l dist + + - name: Upload Release Assets + uses: softprops/action-gh-release@v2 + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + with: + files: dist/bettercap_* + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/build-and-push-docker.yml b/.github/workflows/build-and-push-docker.yml new file mode 100644 index 00000000..c9ad06f1 --- /dev/null +++ b/.github/workflows/build-and-push-docker.yml @@ -0,0 +1,30 @@ +name: Build and Push Docker Images + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64,linux/arm64 + push: true + tags: bettercap/bettercap:latest \ No newline at end of file diff --git a/.github/workflows/test-on-linux.yml b/.github/workflows/test-on-linux.yml new file mode 100644 index 00000000..e920f281 --- /dev/null +++ b/.github/workflows/test-on-linux.yml @@ -0,0 +1,33 @@ +name: Linux tests + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + os: [ubuntu-latest] + go-version: ['1.24.x'] + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + + - name: Install Dependencies + run: sudo apt-get update && sudo apt-get install -y p7zip-full libpcap-dev libnetfilter-queue-dev libusb-1.0-0-dev + + - name: Run Tests + run: | + env GO111MODULE=on make test + \ No newline at end of file diff --git a/.github/workflows/test-on-macos.yml b/.github/workflows/test-on-macos.yml new file mode 100644 index 00000000..b48c57cd --- /dev/null +++ b/.github/workflows/test-on-macos.yml @@ -0,0 +1,33 @@ +name: macOS tests + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + workflow_dispatch: + +jobs: + build: + runs-on: macos-latest + strategy: + matrix: + os: [macos-latest] + go-version: ['1.24.x'] + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + + - name: Install Dependencies + run: brew install libpcap libusb p7zip + + - name: Run Tests + run: | + env GO111MODULE=on make test + \ No newline at end of file diff --git a/.github/workflows/test-on-windows.yml b/.github/workflows/test-on-windows.yml new file mode 100644 index 00000000..b5e6a6e2 --- /dev/null +++ b/.github/workflows/test-on-windows.yml @@ -0,0 +1,47 @@ +name: Windows tests + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + workflow_dispatch: + +jobs: + build: + runs-on: windows-latest + strategy: + matrix: + os: [windows-latest] + go-version: ['1.24.x'] + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + + - name: Install libusb via mingw + uses: msys2/setup-msys2@v2 + with: + install: |- + mingw64/mingw-w64-x86_64-libusb + mingw64/mingw-w64-x86_64-pkg-config + + - name: Install other dependencies + run: | + choco install openssl.light -y + choco install make -y + choco install 7zip -y + choco install zadig -y + curl -L "https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip" -o "C:\wpcap-sdk.zip" + 7z x -y "C:\wpcap-sdk.zip" -o"C:\winpcap" + + - run: echo "D:\a\_temp\msys64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Run Tests + run: env GO111MODULE=on make test + \ No newline at end of file diff --git a/.gitignore b/.gitignore index cca5b812..8b655142 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.sw* *.tar.gz *.prof* +_example/config.js pcaps build bettercap @@ -13,3 +14,7 @@ stage/ /snap .idea +/cover.out +/can-data +/test*.yml +/zerochaos.js \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 59ad652a..00000000 --- a/.travis.yml +++ /dev/null @@ -1,159 +0,0 @@ -# Globals -sudo: false -language: go -go: - - 1.15.x -env: - global: - - VERSION=$(echo ${TRAVIS_BRANCH} | sed "s/\//_/g") - - OUTPUT="bettercap" -cache: - apt: true - -# Includes -linux_deps: &linux_deps - os: linux - dist: bionic - addons: - apt: - packages: - - p7zip-full - - libpcap-dev - - libnetfilter-queue-dev - - libusb-1.0-0-dev - update: true - -finish: &finish - after_success: - - file "${OUTPUT}" - - openssl dgst -sha256 "${OUTPUT}" | tee bettercap_${TARGET_OS}_${TARGET_ARCH}_${VERSION}.sha256 - - 7z a "bettercap_${TARGET_OS}_${TARGET_ARCH}_${VERSION}.zip" "${OUTPUT}" "bettercap_${TARGET_OS}_${TARGET_ARCH}_${VERSION}.sha256" - - ls -la bettercap* - -cross_deps: &cross_deps - <<: *linux_deps - before_install: - - wget --show-progress -qcO "qemu.deb" "https://debian.grena.ge/debian/pool/main/q/qemu/qemu-user-static_4.2-3_amd64.deb" - - sudo dpkg -i "qemu.deb" - -normal_install: &normal_install - install: - - make -e TARGET="${OUTPUT}" - <<: *finish - -cross_install: &cross_install - install: - - sudo builder/arm_builder.sh bettercap make -e TARGET="${OUTPUT}" - <<: *finish - -# Tasks -matrix: - include: - - name: Linux - amd64 - if: tag IS present - arch: amd64 - env: - - TARGET_OS=linux - - TARGET_ARCH=amd64 - <<: *linux_deps - <<: *normal_install - - - name: Linux - aarch64 - if: tag IS present - arch: arm64 - env: - - TARGET_OS=linux - - TARGET_ARCH=aarch64 - - GEM_HOME=~/.ruby - - PATH=$PATH:~/.ruby/bin - <<: *linux_deps - <<: *normal_install - before_install: - - mkdir -p ~/.ruby - - - name: Linux - armhf - if: tag IS present - language: minimal - arch: amd64 - env: - - TARGET_OS=linux - - TARGET_ARCH=armhf - <<: *cross_deps - <<: *cross_install - - - name: OSX - amd64 - if: tag IS present - os: osx - arch: amd64 - addons: - homebrew: - packages: - - libpcap - - libusb - - p7zip - update: true - env: - - TARGET_OS=darwin - - TARGET_ARCH=amd64 - - PATH="/usr/local/opt/libpcap/bin:$PATH" - - LDFLAGS="-L/usr/local/opt/libpcap/lib $LDFLAGS" - - CPPFLAGS="-I/usr/local/opt/libpcap/include $CPPFLAGS" - - PKG_CONFIG_PATH="/usr/local/opt/libpcap/lib/pkgconfig:$PKG_CONFIG_PATH" - <<: *normal_install - - - name: Windows - amd64 - if: tag IS present - os: windows - arch: amd64 - env: - - TARGET_OS=windows - - TARGET_ARCH=amd64 - - PKG_CONFIG_PATH="c:/pkg-config" - - OUTPUT=bettercap.exe - - CGO_CFLAGS="-I/c/npcap/Include -I/c/libusb/include/libusb-1.0" - - CGO_LDFLAGS="-L/c/npcap/Lib/x64 -L/c/libusb/MinGW64/static" - before_install: - - choco install openssl.light -y - - choco install make -y - - choco install 7zip -y - - choco install pkgconfiglite -y - - mkdir /c/pkg-config - - choco install zadig -y - - curl -L "https://github.com/libusb/libusb/releases/download/v1.0.22/libusb-1.0.22.7z" - -o "/c/libusb.7z" - - 7z x -y "/c/libusb.7z" -o"/c/libusb" - - choco install npcap --version 0.86 -y - - curl -L "https://nmap.org/npcap/dist/npcap-sdk-1.03.zip" -o "c:/npcap.zip" - - 7z x -y "/c/npcap.zip" -o"/c/npcap" - - cp builder/libusb.pc /c/pkg-config/libusb.pc - - cp builder/libusb.pc /c/pkg-config/libusb-1.0.pc - <<: *normal_install - - - name: Linux - tests - if: tag IS blank - os: linux - arch: amd64 - allow_failures: - - go: master - fast_finish: true - <<: *linux_deps - script: - - env GO111MODULE=on make test - after_success: - - base <(curl -s https://codecov.io/bash) - -deploy: - provider: releases - api_key: - secure: gaQDeYOe/8lL3++jok73kSNtJVyj5Dk8RdxerjSa3hsVrL5IljsNsGGXocesCQ4ubFrnOO26RmO1FxMKmqYBpewRwQ6GKqZjc7IbwR9Cy0c0AyRRULnCsXue3NxIQBobqAwKtaaqDPHZcX1eOVgDnrheMpT5nt9YN2Xyv9zdFAmjfhUxv8K3nyv9eOMHYy0TmcKanQSXcYTHnUONt4Af5XA2NZGTtLUB+FAEf93vLqyqmmkX0EJciYu3HSZmCPFLLACi1WDSvt+e4TlozrutMpgm3JNzZ3eg6IsesRzxy/s2HeOnVJLMCadGjqap98xfSY6V00cUdCny+n8xfDgCzMljM0bEMDUhIs97AFdLXJZKPRGrNSmnurIcJ+NaVrFS5BMiLwQ2J6WiRvDaCWROVd+Vml/bWWZIUsMxVapEN5vbtw8R/gSVQyZnZUXLrArIBQxenSFlMcWDi+VMF38GrQgAB/ddlMZqWjVubpWOSN45Eity0SsLAgsAuNjH1YCeCr0zj1sG08NPsnTPSKr+661iuOTpsdgu/4crF6qcFcl/kvJsw6tyFPVLO5yzbX9q4O778vXRduzPuBeD63eFuHD8pwceGxWWxN9vnQtX6OqRKmEsrLP7aL9dkI2zgp7TOj058hNQefQ5FD25yfKNCUfp/tnxa6XrkrPzWq/SX7c= - skip_cleanup: true - file_glob: true - file: - - bettercap_*.zip - - bettercap_*.sha256 - on: - tags: true - repo: bettercap/bettercap - branches: - only: - - "/^v[0-9]+\\.[0-9]+\\.[0-9]+[A-Za-z0-9]+?$/" diff --git a/Dockerfile b/Dockerfile index e65d47ea..362ff471 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,11 @@ # build stage -FROM golang:alpine AS build-env +FROM golang:1.24-alpine AS build-env -ENV SRC_DIR $GOPATH/src/github.com/bettercap/bettercap +RUN apk add --no-cache ca-certificates +RUN apk add --no-cache bash gcc g++ binutils-gold iptables wireless-tools build-base libpcap-dev libusb-dev linux-headers libnetfilter_queue-dev git -RUN apk add --update ca-certificates -RUN apk add --no-cache --update bash iptables wireless-tools build-base libpcap-dev libusb-dev linux-headers libnetfilter_queue-dev git - -WORKDIR $SRC_DIR -ADD . $SRC_DIR +WORKDIR $GOPATH/src/github.com/bettercap/bettercap +ADD . $GOPATH/src/github.com/bettercap/bettercap RUN make # get caplets @@ -16,8 +14,8 @@ RUN git clone https://github.com/bettercap/caplets /usr/local/share/bettercap/ca # final stage FROM alpine -RUN apk add --update ca-certificates -RUN apk add --no-cache --update bash iproute2 libpcap libusb-dev libnetfilter_queue wireless-tools +RUN apk add --no-cache ca-certificates +RUN apk add --no-cache bash iproute2 libpcap libusb-dev libnetfilter_queue wireless-tools iw COPY --from=build-env /go/src/github.com/bettercap/bettercap/bettercap /app/ COPY --from=build-env /usr/local/share/bettercap/caplets /app/ WORKDIR /app diff --git a/Makefile b/Makefile index b321e544..3ec8e6cc 100644 --- a/Makefile +++ b/Makefile @@ -2,15 +2,14 @@ TARGET ?= bettercap PACKAGES ?= core firewall log modules network packets session tls PREFIX ?= /usr/local GO ?= go -GOFLAGS ?= all: build build: resources - $(GO) $(GOFLAGS) build -o $(TARGET) . + $(GO) build $(GOFLAGS) -o $(TARGET) . build_with_race_detector: resources - $(GO) $(GOFLAGS) build -race -o $(TARGET) . + $(GO) build $(GOFLAGS) -race -o $(TARGET) . resources: network/manuf.go @@ -18,20 +17,20 @@ network/manuf.go: @python3 ./network/make_manuf.py install: - @mkdir -p $(PREFIX)/share/bettercap/caplets - @cp bettercap $(PREFIX)/bin/ + @mkdir -p $(DESTDIR)$(PREFIX)/share/bettercap/caplets + @cp bettercap $(DESTDIR)$(PREFIX)/bin/ docker: @docker build -t bettercap:latest . test: - $(GO) $(GOFLAGS) test -covermode=atomic -coverprofile=cover.out ./... + $(GO) test -covermode=atomic -coverprofile=cover.out ./... html_coverage: test - $(GO) $(GOFLAGS) tool cover -html=cover.out -o cover.out.html + $(GO) tool cover -html=cover.out -o cover.out.html benchmark: server_deps - $(GO) $(GOFLAGS) test -v -run=doNotRunTests -bench=. -benchmem ./... + $(GO) test -v -run=doNotRunTests -bench=. -benchmem ./... fmt: $(GO) fmt -s -w $(PACKAGES) @@ -40,4 +39,4 @@ clean: $(RM) $(TARGET) $(RM) -r build -.PHONY: all build build_with_race_detector resources install docker test html_coverage benchmark fmt clean \ No newline at end of file +.PHONY: all build build_with_race_detector resources install docker test html_coverage benchmark fmt clean diff --git a/README.md b/README.md index 33346593..299e1d78 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,36 @@ +
+ Join the project community on our server!
+
+
+
+
+
p[2])m=[r+q*Math.ceil((p[0]-r)/q),a[1]]}p=b.layerStatesArray;for(q=p.length-1;0<=q;--q){var u=p[q];r=u.layer;if(yg(u,n)&&f.call(g,r)&&(u=ij(this,r),r.ha()&&(l=u.wa(r.ha().D?m:a,b,c,h,e)),l))return l}};
+k.Ui=function(a,b,c,d,e){return void 0!==this.wa(a,b,c,Re,this,d,e)};function ij(a,b){var c=x(b).toString();if(c in a.c)return a.c[c];for(var d,e=a.S(),f=0,g=pg.length;f
+
+
+
diff --git a/modules/ui/ui/fa-brands-400.ttf b/modules/ui/ui/fa-brands-400.ttf
new file mode 100644
index 00000000..328c0526
Binary files /dev/null and b/modules/ui/ui/fa-brands-400.ttf differ
diff --git a/modules/ui/ui/fa-brands-400.woff b/modules/ui/ui/fa-brands-400.woff
new file mode 100644
index 00000000..2b0861f8
Binary files /dev/null and b/modules/ui/ui/fa-brands-400.woff differ
diff --git a/modules/ui/ui/fa-brands-400.woff2 b/modules/ui/ui/fa-brands-400.woff2
new file mode 100644
index 00000000..b5f9e08f
Binary files /dev/null and b/modules/ui/ui/fa-brands-400.woff2 differ
diff --git a/modules/ui/ui/fa-regular-400.eot b/modules/ui/ui/fa-regular-400.eot
new file mode 100644
index 00000000..8f820c7e
Binary files /dev/null and b/modules/ui/ui/fa-regular-400.eot differ
diff --git a/modules/ui/ui/fa-regular-400.svg b/modules/ui/ui/fa-regular-400.svg
new file mode 100644
index 00000000..f4774621
--- /dev/null
+++ b/modules/ui/ui/fa-regular-400.svg
@@ -0,0 +1,803 @@
+
+
+
+
diff --git a/modules/ui/ui/fa-regular-400.ttf b/modules/ui/ui/fa-regular-400.ttf
new file mode 100644
index 00000000..9f81d9e9
Binary files /dev/null and b/modules/ui/ui/fa-regular-400.ttf differ
diff --git a/modules/ui/ui/fa-regular-400.woff b/modules/ui/ui/fa-regular-400.woff
new file mode 100644
index 00000000..ed70421c
Binary files /dev/null and b/modules/ui/ui/fa-regular-400.woff differ
diff --git a/modules/ui/ui/fa-regular-400.woff2 b/modules/ui/ui/fa-regular-400.woff2
new file mode 100644
index 00000000..5da4177f
Binary files /dev/null and b/modules/ui/ui/fa-regular-400.woff2 differ
diff --git a/modules/ui/ui/fa-solid-900.eot b/modules/ui/ui/fa-solid-900.eot
new file mode 100644
index 00000000..ae0eaad4
Binary files /dev/null and b/modules/ui/ui/fa-solid-900.eot differ
diff --git a/modules/ui/ui/fa-solid-900.svg b/modules/ui/ui/fa-solid-900.svg
new file mode 100644
index 00000000..02ad6d36
--- /dev/null
+++ b/modules/ui/ui/fa-solid-900.svg
@@ -0,0 +1,4527 @@
+
+
+
+
diff --git a/modules/ui/ui/fa-solid-900.ttf b/modules/ui/ui/fa-solid-900.ttf
new file mode 100644
index 00000000..52739b55
Binary files /dev/null and b/modules/ui/ui/fa-solid-900.ttf differ
diff --git a/modules/ui/ui/fa-solid-900.woff b/modules/ui/ui/fa-solid-900.woff
new file mode 100644
index 00000000..990c8be5
Binary files /dev/null and b/modules/ui/ui/fa-solid-900.woff differ
diff --git a/modules/ui/ui/fa-solid-900.woff2 b/modules/ui/ui/fa-solid-900.woff2
new file mode 100644
index 00000000..a0fb9f03
Binary files /dev/null and b/modules/ui/ui/fa-solid-900.woff2 differ
diff --git a/modules/ui/ui/favicon.ico b/modules/ui/ui/favicon.ico
new file mode 100644
index 00000000..8081c7ce
Binary files /dev/null and b/modules/ui/ui/favicon.ico differ
diff --git a/modules/ui/ui/index.html b/modules/ui/ui/index.html
new file mode 100644
index 00000000..91e6202a
--- /dev/null
+++ b/modules/ui/ui/index.html
@@ -0,0 +1,15 @@
+
+
+ No commands available for this module. {{ cmd.description }} No parameters available for this module. {{ p.value.description }} \n No caplets installed so far.\n \n {{ sessionError.message }}\n \n {{ api.settings.URL() }} is using an insecure connection, refer to the documentation to configure the api.rest module to use SSL. No commands available for this module. {{ cmd.description }} No parameters available for this module. {{ p.value.description }} \\n No caplets installed so far.\\n \\n {{ sessionError.message }}\\n \\n {{ api.settings.URL() }} is using an insecure connection, refer to the documentation to configure the api.rest module to use SSL.Status
\n\n \n \n
\n \n \n UI Version \n \n {{ environment.version }}\n \n requires API {{ environment.requires }}\n \n \n \n \n Connected To \n \n {{ api.settings.URL() }}\n \n polled every {{ api.settings.interval }}ms with a ping of {{ api.ping }}ms\n \n (paused)\n \n \n \n \n \n\n API Version \n \n {{ api.session.version }} \n \n compiled with {{ api.session.goversion }} for {{ api.session.os }} {{ api.session.arch }}\n \n \n \n \n CPU \n Using {{ api.session.resources.max_cpus }} of {{ api.session.resources.cpus }} logical CPUs \n ({{ api.session.resources.goroutines }} goroutines)\n \n \n \n\n \n MEM \n \n Heap: {{ api.session.resources.alloc | size }} Sys: {{ api.session.resources.sys | size }} \n \n gc cycles: {{ api.session.resources.gcs }}\n \n \n Options
\n\n \n \n
\n \n \n \n {{ arg.key }} \n \n \n Variables
\n\n \n \n
\n \n \n \n {{ val.key }} \n \n \n Interfaces
\n\n \n \n
\n\n \n \n \n {{ iface.name }} \n {{ iface.flags }}\n \n \n \n {{ iface.mac | uppercase }} \n {{ iface.vendor }}\n \n \n \n \n \n not connected\n \n \n \n \n {{ a.address }} {{ a.type }}\n \n Packets per Protocol
\n\n \n \n
\n \n \n \n {{ proto.key }} \n \n \n Commands
\n\n Parameters
\n\n \n \n
\n\n \n \n \n \n\n RSSI \n MAC \n Name \n Vendor \n Flags \n Connectable \n Services \n Seen \n \n \n\n \n empty\n \n \n \n \n \n \n \n \n \n {{ (device.name ? device.name : device.alias ? '' : 'none') | unbash }}\n \n {{ device.alias }}\n \n \n\n {{ device.vendor ? device.vendor : 'unknown' }} \n {{ device.flags ? device.flags : 'none' }} \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n 0\">\n \n {{ device.services.length }}\n \n \n \n \n\n \n \n 0\" ngbTooltip=\"Refresh\" class=\"fas fa-sync-alt\">\n \n \n {{ device.last_seen | date: 'HH:mm:ss' }} \n \n \n
\n\n \n \n \n Handles \n \n \n Service\n \n \n \n Characteristics\n \n \n Properties \n Data \n \n \n \n \n {{ svc.handle }}\n \n {{ svc.end_handle }}\n \n \n \n \n {{ svc.name }}\n \n {{ svc.uuid }}\n \n \n {{ svc.uuid }}\n \n \n \n \n \n \n \n {{ ch.handle }}\n \n \n \n \n {{ ch.name }}\n \n {{ ch.uuid }}\n \n \n {{ ch.uuid }}\n \n \n \n {{ ch.properties.join(', ') | unbash }}\n \n \n \n {{ ch.data | unbash }}\n \n \n \n \n \n
\n \n
\n
\n
\n \n \n
\n\n \n \n \n Muted\n \n \n \n\n \n \n \n \n
\n\n \n \n \n\n Time \n Type \n \n \n \n\n \n empty\n \n \n \n \n {{ event.time | date: 'short' }} \n \n \n \n \n \n \n \n
\n\n \n \n \n\n Address \n Type \n Data \n Channels \n Seen \n \n \n\n \n empty\n \n \n \n \n \n \n {{ device.address | uppercase }}\n\n \n {{ device.alias }}\n \n\n \n \n \n injecting ...\n \n \n sniffing ...\n \n \n \n \n \n \n\n \n \n {{ device.type ? device.type : 'unknown'}}\n \n \n 0\n\n \n {{ device.channels.join(', ') }} \n {{ device.last_seen | date: 'HH:mm:ss' }} \n \n \n
\n\n \n \n \n IP \n MAC \n Hostname \n Vendor \n Sent \n Recvd \n Seen \n Info \n \n \n\n \n empty\n \n \n \n \n \n \n \n \n \n {{ host.hostname }}\n \n \n {{ host.alias }}\n \n \n {{ host.vendor ? host.vendor : 'unknown' }} \n {{ host.sent | size }} \n {{ host.received | size }} \n {{ host.last_seen | date: 'HH:mm:ss'}} \n \n\n interface\n gateway\n\n \n\n \n ERROR
\n WARNING
\n
\n \n \n
\n\n \n\n \n \n \n \n Not running\n \n \n\n \n \n No satellites\n \n \n\n 0\">Updated \n 0\">\n {{ api.session.gps.Updated | date:'HH:mm:ss' }} \n \n\n {{ gps.key }} \n {{ gps.value }} \n \n \n
\n \n \n \n \n \n\n RSSI \n BSSID \n ESSID \n Vendor \n Encryption \n\n Ch \n \n \n \n\n Clients \n Sent \n Recvd \n Seen \n \n \n\n \n empty\n \n \n \n \n \n \n \n\n '\">\n {{ ap.hostname }}\n {{ ap.alias }}\n \n\n \n {{ ap.vendor ? ap.vendor : 'unknown' }}\n \n\n \n \n\n \n \n {{ ap.encryption }}\n \n\n \n \n \n \n \n \n {{ ap.channel }}\n \n\n \n 0\n 0\">\n \n {{ ap.clients.length }}\n \n \n \n \n \n\n {{ ap.sent | size }} \n {{ ap.received | size }} \n {{ ap.last_seen | date: 'HH:mm:ss' }} \n\n \n \n
\n\n \n \n \n RSSI \n MAC \n Vendor \n Sent \n Recvd \n First Seen \n Last Seen \n \n \n\n \n empty\n \n \n \n \n \n \n \n \n \n \n\n \n \n {{ client.alias }}\n \n \n \n {{ client.vendor ? client.vendor : 'unknown' }}\n \n {{ client.sent | size }} \n {{ client.received | size }} \n \n {{ client.first_seen | date: 'HH:mm:ss' }}\n \n \n {{ client.last_seen | date: 'HH:mm:ss' }}\n \n Status
\\n\\n \\n \\n
\\n \\n \\n UI Version \\n \\n {{ environment.version }}\\n \\n requires API {{ environment.requires }}\\n \\n \\n \\n \\n Connected To \\n \\n {{ api.settings.URL() }}\\n \\n polled every {{ api.settings.interval }}ms with a ping of {{ api.ping }}ms\\n \\n (paused)\\n \\n \\n \\n \\n \\n\\n API Version \\n \\n {{ api.session.version }} \\n \\n compiled with {{ api.session.goversion }} for {{ api.session.os }} {{ api.session.arch }}\\n \\n \\n \\n \\n CPU \\n Using {{ api.session.resources.max_cpus }} of {{ api.session.resources.cpus }} logical CPUs \\n ({{ api.session.resources.goroutines }} goroutines)\\n \\n \\n \\n\\n \\n MEM \\n \\n Heap: {{ api.session.resources.alloc | size }} Sys: {{ api.session.resources.sys | size }} \\n \\n gc cycles: {{ api.session.resources.gcs }}\\n \\n \\n Options
\\n\\n \\n \\n
\\n \\n \\n \\n {{ arg.key }} \\n \\n \\n Variables
\\n\\n \\n \\n
\\n \\n \\n \\n {{ val.key }} \\n \\n \\n Interfaces
\\n\\n \\n \\n
\\n\\n \\n \\n \\n {{ iface.name }} \\n {{ iface.flags }}\\n \\n \\n \\n {{ iface.mac | uppercase }} \\n {{ iface.vendor }}\\n \\n \\n \\n \\n \\n not connected\\n \\n \\n \\n \\n {{ a.address }} {{ a.type }}\\n \\n Packets per Protocol
\\n\\n \\n \\n
\\n \\n \\n \\n {{ proto.key }} \\n \\n \\n Commands
\\n\\n Parameters
\\n\\n \\n \\n
\\n\\n \\n \\n \\n \\n\\n RSSI \\n MAC \\n Name \\n Vendor \\n Flags \\n Connectable \\n Services \\n Seen \\n \\n \\n\\n \\n empty\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n {{ (device.name ? device.name : device.alias ? '' : 'none') | unbash }}\\n \\n {{ device.alias }}\\n \\n \\n\\n {{ device.vendor ? device.vendor : 'unknown' }} \\n {{ device.flags ? device.flags : 'none' }} \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n 0\\\">\\n \\n {{ device.services.length }}\\n \\n \\n \\n \\n\\n \\n \\n 0\\\" ngbTooltip=\\\"Refresh\\\" class=\\\"fas fa-sync-alt\\\">\\n \\n \\n {{ device.last_seen | date: 'HH:mm:ss' }} \\n \\n \\n
\\n\\n \\n \\n \\n Handles \\n \\n \\n Service\\n \\n \\n \\n Characteristics\\n \\n \\n Properties \\n Data \\n \\n \\n \\n \\n {{ svc.handle }}\\n \\n {{ svc.end_handle }}\\n \\n \\n \\n \\n {{ svc.name }}\\n \\n {{ svc.uuid }}\\n \\n \\n {{ svc.uuid }}\\n \\n \\n \\n \\n \\n \\n \\n {{ ch.handle }}\\n \\n \\n \\n \\n {{ ch.name }}\\n \\n {{ ch.uuid }}\\n \\n \\n {{ ch.uuid }}\\n \\n \\n \\n {{ ch.properties.join(', ') | unbash }}\\n \\n \\n \\n {{ ch.data | unbash }}\\n \\n \\n \\n \\n \\n
\\n \\n
\\n
\\n
\\n \\n \\n
\\n\\n \\n \\n \\n Muted\\n \\n \\n \\n\\n \\n \\n \\n \\n
\\n\\n \\n \\n \\n\\n Time \\n Type \\n \\n \\n \\n\\n \\n empty\\n \\n \\n \\n \\n {{ event.time | date: 'short' }} \\n \\n \\n \\n \\n \\n \\n \\n
\\n\\n \\n \\n \\n\\n Address \\n Type \\n Data \\n Channels \\n Seen \\n \\n \\n\\n \\n empty\\n \\n \\n \\n \\n \\n \\n {{ device.address | uppercase }}\\n\\n \\n {{ device.alias }}\\n \\n\\n \\n \\n \\n injecting ...\\n \\n \\n sniffing ...\\n \\n \\n \\n \\n \\n \\n\\n \\n \\n {{ device.type ? device.type : 'unknown'}}\\n \\n \\n 0\\n\\n \\n {{ device.channels.join(', ') }} \\n {{ device.last_seen | date: 'HH:mm:ss' }} \\n \\n \\n
\\n\\n \\n \\n \\n IP \\n MAC \\n Hostname \\n Vendor \\n Sent \\n Recvd \\n Seen \\n Info \\n \\n \\n\\n \\n empty\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n {{ host.hostname }}\\n \\n \\n {{ host.alias }}\\n \\n \\n {{ host.vendor ? host.vendor : 'unknown' }} \\n {{ host.sent | size }} \\n {{ host.received | size }} \\n {{ host.last_seen | date: 'HH:mm:ss'}} \\n \\n\\n interface\\n gateway\\n\\n \\n\\n \\n ERROR
\\n WARNING
\\n
\\n \\n \\n
\\n\\n \\n\\n \\n \\n \\n \\n Not running\\n \\n \\n\\n \\n \\n No satellites\\n \\n \\n\\n 0\\\">Updated \\n 0\\\">\\n {{ api.session.gps.Updated | date:'HH:mm:ss' }} \\n \\n\\n {{ gps.key }} \\n {{ gps.value }} \\n \\n \\n
\\n \\n \\n \\n \\n \\n\\n RSSI \\n BSSID \\n ESSID \\n Vendor \\n Encryption \\n\\n Ch \\n \\n \\n \\n\\n Clients \\n Sent \\n Recvd \\n Seen \\n \\n \\n\\n \\n empty\\n \\n \\n \\n \\n \\n \\n \\n\\n '\\\">\\n {{ ap.hostname }}\\n {{ ap.alias }}\\n \\n\\n \\n {{ ap.vendor ? ap.vendor : 'unknown' }}\\n \\n\\n \\n \\n\\n \\n \\n {{ ap.encryption }}\\n \\n\\n \\n \\n \\n \\n \\n \\n {{ ap.channel }}\\n \\n\\n \\n 0\\n 0\\\">\\n \\n {{ ap.clients.length }}\\n \\n \\n \\n \\n \\n\\n {{ ap.sent | size }} \\n {{ ap.received | size }} \\n {{ ap.last_seen | date: 'HH:mm:ss' }} \\n\\n \\n \\n
\\n\\n \\n \\n \\n RSSI \\n MAC \\n Vendor \\n Sent \\n Recvd \\n First Seen \\n Last Seen \\n \\n \\n\\n \\n empty\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n \\n {{ client.alias }}\\n \\n \\n \\n {{ client.vendor ? client.vendor : 'unknown' }}\\n \\n {{ client.sent | size }} \\n {{ client.received | size }} \\n \\n {{ client.first_seen | date: 'HH:mm:ss' }}\\n \\n \\n {{ client.last_seen | date: 'HH:mm:ss' }}\\n \\n ","
"],col:[2,"
"],tr:[2,"","
"],td:[3,"
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n","