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/00-cpp_compat.patch b/00-cpp_compat.patch index 1060f11..52818c4 100644 --- a/00-cpp_compat.patch +++ b/00-cpp_compat.patch @@ -1,5 +1,5 @@ ---- a/epan/epan.h 2024-04-20 00:34:15.534364916 -0700 -+++ b/epan/epan.h 2024-04-20 00:34:25.094467480 -0700 +--- epan.h.old 2024-04-20 00:34:15.534364916 -0700 ++++ epan.h 2024-04-20 00:34:25.094467480 -0700 @@ -10,9 +10,6 @@ #ifndef __EPAN_H__ #define __EPAN_H__ diff --git a/01-radio_bearer_config.patch b/01-radio_bearer_config.patch deleted file mode 100644 index b3444a4..0000000 --- a/01-radio_bearer_config.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/epan/dissectors/asn1/nr-rrc/nr-rrc.cnf b/epan/dissectors/asn1/nr-rrc/nr-rrc.cnf -index fd478d8969..b3b89250e0 100644 ---- a/epan/dissectors/asn1/nr-rrc/nr-rrc.cnf -+++ b/epan/dissectors/asn1/nr-rrc/nr-rrc.cnf -@@ -145,7 +145,7 @@ PH-TypeListMCG - PH-TypeListSCG - RA-ReportList-r16 - RACH-ConfigCommon --RadioBearerConfig -+RadioBearerConfig @radio_bearer_conf - ReferenceTime-r16 - RRCReconfiguration @rrc_reconf - RRCReconfigurationComplete -diff --git a/epan/dissectors/packet-nr-rrc.c b/epan/dissectors/packet-nr-rrc.c -index 75977474c0..cfa8602711 100644 ---- a/epan/dissectors/packet-nr-rrc.c -+++ b/epan/dissectors/packet-nr-rrc.c -@@ -112214,6 +112214,7 @@ proto_register_nr_rrc(void) { - register_dissector("nr-rrc.ue_nr_cap", dissect_nr_rrc_UE_NR_Capability_PDU, proto_nr_rrc); - register_dissector("nr-rrc.sbcch.sl.bch", dissect_SBCCH_SL_BCH_Message_PDU, proto_nr_rrc); - register_dissector("nr-rrc.scch", dissect_SCCH_Message_PDU, proto_nr_rrc); -+ register_dissector("nr-rrc.radio_bearer_conf", dissect_nr_rrc_RadioBearerConfig_PDU, proto_nr_rrc); - - - /*--- End of included file: packet-nr-rrc-dis-reg.c ---*/ 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 b941ad1..05ed3ba 100644 --- a/Makefile +++ b/Makefile @@ -1,30 +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 "$@" -mobileinsight-spark.sif: with-spark.def mobileinsight.sif +mobileinsight.tar.gz: .docker_build + "$(DOCKER)" save mobileinsight:latest | gzip > "$@" + +mobileinsight.sif: mobileinsight.def .docker_build "$(APPTAINER)" build "$@" "$<" -prepare: +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 - -run: mobileinsight.sif prepare @$(APPTAINER) run --overlay "$(OVERLAY_DIR)" \ -B "/run/user/$(UID)" mobileinsight.sif -run-spark: mobileinsight-spark.sif prepare - @$(APPTAINER) run --overlay "$(OVERLAY_DIR)" \ - -B "/run/user/$(UID)" mobileinsight-spark.sif - clean: - rm -rf *.sif $(OVERLAY_DIR) + "$(DOCKER)" container prune + "$(DOCKER)" image prune -a + rm -f .docker_build mobileinsight.tar.gz mobileinsight.sif -.PHONY: prepare run run-spark 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 a444d97..7de1e77 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,13 @@ MobileInsight Apptainer ======================= -Single launch binary for -[MobileInsight](https://github.com/mobile-insight/mobileinsight-core) in an -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 ----- @@ -29,18 +21,17 @@ $ ./mobileinsight.sif python3 "$PYTHON_ARGS" # Start a bash shell inside the container $ ./mobileinsight.sif bash - -# Only available in spark version -# -# Start a pyspark interpreter -$ ./mobileinsight-spark.sif pyspark ``` Examples are stored in /opt/mobileinsight-examples. -Build ------ +Building +-------- -Run `make mobileinsight.sif` or `make mobileinsight-spark.sif` to build the -corresponding apptainer image. The spark version includes both `mobileinsight` -along with `pyspark` for distributed log processing. +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 810c4ab..7918624 100644 --- a/mobileinsight.def +++ b/mobileinsight.def @@ -1,94 +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 - 01-radio_bearer_config.patch /build/01-radio_bearer_config.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-venv \ - 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 "https://github.com/wireshark/wireshark/archive/refs/tags/v{{ WS_VER }}.tar.gz" \ - -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 }}" - for patch in /build/*.patch; do - patch -p1 < "$patch" - done - 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 @@ -98,4 +9,3 @@ From: ubuntu:22.04 else "$@" fi - diff --git a/with-spark.def b/with-spark.def deleted file mode 100644 index 16cdf96..0000000 --- a/with-spark.def +++ /dev/null @@ -1,16 +0,0 @@ -Bootstrap: localimage -From: mobileinsight.sif - -%post - # Update and install dependencies - export DEBIAN_FRONTEND=noninteractive - apt-get update - apt-get upgrade -y - apt-get install -y \ - python3-pandas \ - openjdk-8-jre-headless \ - scala - pip3 install pyspark[sql]==3.5.1 dill==0.3.8 - - # Cleanup - apt-get autoclean -y