diff --git a/.gitignore b/.gitignore index b071de0..730dfce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ +*.tar.gz *.sif +.docker_build overlay/ +shared/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b79eefd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,97 @@ +FROM ubuntu:22.04 + +ARG MAX_THREADS=1 +ARG WS_VER=3.4.0 +ARG MI_BRANCH=ubuntu22-py310 +ARG WIRESHARK_URL=http://www.mobileinsight.net/wireshark-${WS_VER}-rbc-dissector.tar.xz +ADD 00-cpp_compat.patch /build/00-cpp_compat.patch + +# Run apt update +RUN set -ex; \ + export DEBIAN_FRONTEND=noninteractive; \ + apt-get update; \ + apt-get upgrade -y; \ + apt-get install -y \ + git \ + python3 \ + python3-pip \ + python3-wxgtk4.0 \ + python3-matplotlib \ + cmake \ + pkg-config \ + wget \ + libglib2.0-dev \ + bison \ + flex \ + libpcap-dev \ + libgcrypt-dev \ + qtbase5-dev \ + qtchooser \ + qt5-qmake \ + qtbase5-dev-tools \ + qttools5-dev \ + qtmultimedia5-dev \ + libqt5svg5-dev \ + libc-ares-dev \ + libsdl2-mixer-2.0-0 \ + libsdl2-image-2.0-0 \ + libsdl2-2.0-0; + +# Download resources +RUN set -ex; \ + mkdir -p /build; \ + cd /build; \ + wget "$WIRESHARK_URL" -nv -O "wireshark-$WS_VER.tar.xz"; \ + tar -xf "wireshark-$WS_VER.tar.xz"; \ + git clone "https://github.com/mobile-insight/mobileinsight-core.git"; \ + git -C mobileinsight-core checkout "$MI_BRANCH"; + +# Compile and install wireshark +RUN set -ex; \ + cd "/build/wireshark-$WS_VER"; \ + patch epan/epan.h < /build/00-cpp_compat.patch; \ + cmake -DBUILD_wireshark=OFF .; \ + make -j "$MAX_THREADS"; \ + make install; \ + ldconfig; + +# Compile and install Wireshark dissector +Run set -ex; \ + cd /build/mobileinsight-core/ws_dissector; \ + g++ ws_dissector.cpp packet-aww.cpp -o ws_dissector \ + $(pkg-config --libs --cflags glib-2.0) \ + -I"/build/wireshark-$WS_VER" \ + -L"/usr/local/lib" \ + -lwireshark \ + -lwsutil \ + -lwiretap; \ + strip ws_dissector; \ + install -Dm 755 ws_dissector /usr/local/bin/ws_dissector; + +# Compile and install MobileInsight +Run set -ex; \ + cd /build/mobileinsight-core; \ + pip3 install pyserial; \ + python3 setup.py install; + +# Install MobileInsight GUI +Run set -ex; \ + cd /build/mobileinsight-core; \ + mkdir -p /usr/local/share/mobileinsight; \ + cp -r gui/* /usr/local/share/mobileinsight;\ + ln -s /usr/local/share/mobileinsight/mi-gui /usr/local/bin/mi-gui; + +# Install examples +Run set -ex; \ + cd /build/mobileinsight-core; \ + cp -r examples /opt/mobileinsight-examples; + +# Link python3 to python +Run set -ex; \ + cd /usr/bin; \ + ln -s python3 python; + +# Cleanup +Run set -ex; \ + apt-get autoclean -y; \ + rm -rf /build; diff --git a/Makefile b/Makefile index c833f9f..05ed3ba 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,44 @@ -APPTAINER ?= singularity +DOCKER ?= docker +APPTAINER ?= apptainer OVERLAY_DIR ?= ./overlay -NUM_THREADS ?= $(shell grep -c processor /proc/cpuinfo) +SHARED_DIR ?= ./shared +MAX_THREADS ?= $(shell grep -c processor /proc/cpuinfo) UID := $(shell id -u) +GID := $(shell id -g) -.DEFAULT_GOAL := mobileinsight.sif +.DEFAULT_GOAL := .docker_build -mobileinsight.sif: mobileinsight.def - "$(APPTAINER)" build --build-arg="NUM_THREADS=$(NUM_THREADS)" "$@" "$<" +.docker_build: Dockerfile + "$(DOCKER)" build --build-arg "MAX_THREADS=$(MAX_THREADS)" -t mobileinsight . + touch "$@" -run: mobileinsight.sif +mobileinsight.tar.gz: .docker_build + "$(DOCKER)" save mobileinsight:latest | gzip > "$@" + +mobileinsight.sif: mobileinsight.def .docker_build + "$(APPTAINER)" build "$@" "$<" + +run: .docker_build + @mkdir -p "$(SHARED_DIR)" + @test -n "$(shell docker image ls -q mobileinsight)" \ + || (echo Cannot find image mobileinsight:latest, has it been built yet? 1>&2 \ + && false) + @"$(DOCKER)" run --rm -it --privileged -v "$(SHARED_DIR):/mnt" \ + -e TERM -u root --entrypoint bash mobileinsight:latest + +app-run: mobileinsight.sif @mkdir -p "$(OVERLAY_DIR)" @lsmod | grep overlay > /dev/null || sudo modprobe overlay @$(APPTAINER) run --overlay "$(OVERLAY_DIR)" \ -B "/run/user/$(UID)" mobileinsight.sif clean: - rm -f mobileinsight.sif $(OVERLAY_DIR) + "$(DOCKER)" container prune + "$(DOCKER)" image prune -a + rm -f .docker_build mobileinsight.tar.gz mobileinsight.sif -.PHONY: run clean +clean-data: + rm -rf $(OVERLAY_DIR) $(SHARED_DIR) + +.PHONY: sc-run run clean clean-data diff --git a/README.md b/README.md index 927d7b7..7de1e77 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,13 @@ MobileInsight Apptainer ======================= -Single launch binary for [MobileInsight](https://github.com/mobile-insight) in -a Ubuntu 22.04 SIF portable container. +Single launch binary for MobileInsight in a Ubuntu 22.04 portable container. Dependencies ------------ -Either one of the following dependencies is needed to run or build SIF images: - -- [Apptainer](https://apptainer.org/) -- [Singularity](https://sylabs.io/singularity/) - -To use the `make run` command, the overlay Linux kernel module must also be -available on the system. This allows you to make changes to the SIF file using -an overlay filesystem. +The host side only needs `apptainer` or `singularity` to function. A gui is +needed to launch the log viewer. Usage ----- @@ -32,7 +25,13 @@ $ ./mobileinsight.sif bash Examples are stored in /opt/mobileinsight-examples. -Build ------ +Building +-------- + +To build the apptainer, the following dependencies are needed on the host +machine: + +1. Apptainer or Singularity +2. Docker Run `make mobileinsight.sif` to build the apptainer image. diff --git a/mobileinsight.def b/mobileinsight.def index 4b0d801..7918624 100644 --- a/mobileinsight.def +++ b/mobileinsight.def @@ -1,90 +1,5 @@ -BootStrap: docker -From: ubuntu:22.04 - -%arguments - NUM_THREADS=1 - WS_VER=3.4.0 - MI_COMMIT=4b204e0 - -%files - 00-cpp_compat.patch /build/00-cpp_compat.patch - -%post - # Update and install dependencies - mkdir -p /build - export DEBIAN_FRONTEND=noninteractive - apt-get update - apt-get upgrade -y - apt-get install -y \ - git \ - python3 \ - python3-pip \ - python3-wxgtk4.0 \ - python3-matplotlib \ - cmake \ - pkg-config \ - wget \ - libglib2.0-dev \ - bison \ - flex \ - libpcap-dev \ - libgcrypt-dev \ - qtbase5-dev \ - qtchooser \ - qt5-qmake \ - qtbase5-dev-tools \ - qttools5-dev \ - qtmultimedia5-dev \ - libqt5svg5-dev \ - libc-ares-dev \ - libsdl2-mixer-2.0-0 \ - libsdl2-image-2.0-0 \ - libsdl2-2.0-0 - pip3 install pyserial - - # Download resources - cd /build - wget "http://www.mobileinsight.net/wireshark-{{ WS_VER }}-rbc-dissector.tar.xz" -nv \ - -O "wireshark-{{ WS_VER }}.tar.xz" - tar -xf "wireshark-{{ WS_VER }}.tar.xz" - git clone "https://github.com/mobile-insight/mobileinsight-core.git" - git -C mobileinsight-core checkout "{{ MI_COMMIT }}" - - # Compile and install wireshark - cd "/build/wireshark-{{ WS_VER }}" - patch epan/epan.h < /build/00-cpp_compat.patch - cmake -DBUILD_wireshark=OFF . - make -j "{{ NUM_THREADS }}" - make install - ldconfig - - # Compile and install Wireshark dissector - cd /build/mobileinsight-core/ws_dissector - g++ ws_dissector.cpp packet-aww.cpp -o ws_dissector \ - $(pkg-config --libs --cflags glib-2.0) \ - -I"/build/wireshark-{{ WS_VER }}" \ - -L"/usr/local/lib" \ - -lwireshark \ - -lwsutil \ - -lwiretap - strip ws_dissector - install -Dm 755 ws_dissector /usr/local/bin/ws_dissector - - # Compile and install MobileInsight - cd /build/mobileinsight-core - python3 setup.py install - mkdir -p /usr/local/share/mobileinsight - cp -r gui/* /usr/local/share/mobileinsight - ln -s /usr/local/share/mobileinsight/mi-gui /usr/local/bin/mi-gui - cp -r examples /opt/mobileinsight-examples - - # Link python3 to python - cd /usr/bin - ln -s python3 python - - # Cleanup - apt-get autoclean -y - rm -rf /build +BootStrap: docker-daemon +From: mobileinsight:latest %runscript set -e @@ -94,4 +9,3 @@ From: ubuntu:22.04 else "$@" fi -