aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/build.yml
blob: eb237ea09b7ce39703ff9c6aebfae3c92b35a8b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
name: Build
on:
  push:
    branches:
      - dev
  pull_request:
    branches:
      - dev
    types: [opened, synchronize, reopened]
  release:
    types: [created]
jobs:
  python-bindings:
    name: Python Bindings (ubuntu-latest)
    runs-on: ubuntu-latest
    env:
      CFLAGS: -Werror
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Set up Python 3.9
        uses: actions/setup-python@v5
        with:
          python-version: "3.9"
      - name: Install Ubuntu Prerequisites
        run: |
          sudo apt-get update
          sudo apt-get install autoconf automake libtool pkg-config gettext libjson-c-dev flex bison libpcap-dev
      - name: Build nDPI library
        run: |
          ./autogen.sh
          make
          sudo make install
      - name: Generate Python bindings
        run: |
          pip install --upgrade pip
          pip install -r python/requirements.txt
          cd python
          python setup.py install
          cd ..
      - name: Test Python Bindings
        run: |
          cd python
          python tests.py
  test-scripts:
    name: Test Utils (ubuntu-latest)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Install Ubuntu Prerequisites
        run: |
          sudo apt-get update
          sudo apt-get install python3-netaddr git whois libxml2-utils
      - name: Run Scripts
        run: |
          echo 'Running ./utils/bitcoinnodes.sh'
          ./utils/bitcoinnodes.sh >/dev/null
          echo 'Running ./utils/get_routes_by_asn.sh AS714'
          ./utils/get_routes_by_asn.sh AS714 >/dev/null
          echo 'Running ./utils/update_every_lists.sh'
          ./utils/update_every_lists.sh
          echo 'Checking for changes in the git tree..'
          git update-index --refresh || echo "::warning file=utils/update_every_lists.sh::Please re-run utils/update_every_lists.sh and commit any changes."
          git diff-index --quiet HEAD -- || true

  test:
    name: ${{ matrix.os }} ${{ matrix.arch }} ${{ matrix.gcrypt }} ${{ matrix.compiler }} ${{ matrix.pcre }} ${{ matrix.maxminddb }} ${{ matrix.msan }} ${{ matrix.nBPF }} ${{matrix.lto_gold_linker}} ${{matrix.global_context}}
    runs-on: ${{ matrix.os }}
    env:
      CC: ${{ matrix.compiler }}
      CFLAGS: -Werror
    strategy:
      fail-fast: true
      matrix:
        # ubuntu-latest == ubuntu-22.04
        # macOS-latest == macos-12
        os: ["ubuntu-latest", "ubuntu-20.04", "macOS-latest", "macos-13", "windows-latest"]
        arch: ["x86_64"]
        gcrypt: ["--with-local-libgcrypt", ""]
        compiler: ["cc"]
        ar: ["ar"]
        ranlib: ["ranlib"]
        pcre: [""]
        maxminddb: [""]
        msan: [""]
        nBPF: [""]
        lto_gold_linker: [""]
        global_context: [""] #Enable by default
        include:
          - compiler: "gcc-4.9" # "Oldest" gcc easily available. To simulate RHEL7
            os: ubuntu-20.04
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-sanitizer"
            nBPF: ""
          - compiler: "gcc-13" # "Newest" gcc easily available
            os: ubuntu-22.04
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-sanitizer"
            nBPF: ""
            lto_gold_linker: "--with-lto-and-gold-linker"
          - compiler: "clang-7" # "Oldest" clang easily available
            os: ubuntu-20.04
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-sanitizer"
            nBPF: ""
          - compiler: "clang-17" # "Newest" clang easily available
            ar: "llvm-ar-17"
            ranlib: "llvm-ranlib-17"
            os: ubuntu-22.04
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-sanitizer"
            nBPF: ""
            lto_gold_linker: "--with-lto-and-gold-linker"
          - compiler: "cc"
            os: ubuntu-latest
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-thread-sanitizer"
            nBPF: ""
          - compiler: "cc"
            os: ubuntu-latest
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-sanitizer"
            nBPF: "nBPF"
          - compiler: "cc"
            os: ubuntu-latest
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-sanitizer"
            nBPF: ""
            global_context: "--disable-global-context-support"
          - compiler: "clang-17"
            os: ubuntu-22.04
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-memory-sanitizer"
            nBPF: ""
          - compiler: "cc"
            os: macOS-latest
            arch: "x86_64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "" # Disable sanitizer on macos
            nBPF: ""
          - compiler: "cc"
            os: macos-14
            arch: "x86_64"
            gcrypt: ""
            pcre: ""
            maxminddb: ""
            msan: "" # Disable sanitizer on macos
            nBPF: ""
          - compiler: "cc"
            os: ubuntu-latest
            arch: "arm64"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "" # Disable sanitizer on arm64
            nBPF: ""
          - compiler: "cc"
            os: ubuntu-latest
            arch: "armhf"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: "--with-sanitizer"
            nBPF: ""
          - compiler: "cc"
            os: ubuntu-latest
            arch: "s390x"
            gcrypt: ""
            pcre: "--with-pcre2"
            maxminddb: "--with-maxminddb"
            msan: ""
            nBPF: ""
    steps:
      - name: Setup multiarch/qemu-user-static
        if: startsWith(matrix.os, 'ubuntu') && !startsWith(matrix.arch, 'x86_64')
        run: |
          docker run --rm --privileged multiarch/qemu-user-static:register --reset
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis
      - name: Install Ubuntu Prerequisites
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64')
        run: |
          sudo apt-get update
          sudo apt-get install autoconf automake libtool pkg-config gettext libjson-c-dev flex bison libpcap-dev
          sudo apt-get install gcc-mingw-w64 libc6-dev
          sudo apt-get install doxygen python3-sphinx python3-sphinx-rtd-theme python3-breathe python3-pip
          sudo apt-get install rrdtool librrd-dev
      - name: Install Ubuntu Prerequisites (libgcrypt)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.gcrypt, '--with-local-libgcrypt')
        run: |
          sudo apt-get install libgcrypt20-dev
      - name: Install Ubuntu Prerequisites (libpcre2)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.pcre, '--with-pcre2')
        run: |
          sudo apt-get install libpcre3-dev
      - name: Install Ubuntu Prerequisites (maxminddb)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.maxminddb, '--with-maxminddb')
        run: |
          sudo apt-get install libmaxminddb-dev
      - name: Install Ubuntu Prerequisites (nBPF)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.nBPF, 'nBPF')
        run: |
          git clone https://github.com/ntop/PF_RING.git ../PF_RING
          cd ../PF_RING/userland/nbpf
          ./configure
          make
          cd -
      - name: Setup Ubuntu specified compiler
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64') && ! startsWith(matrix.compiler, 'cc') && ! startsWith(matrix.compiler, 'clang-17')
        run: |
          #For gcc-4.9 (on ubuntu-20.04)
          echo "deb http://dk.archive.ubuntu.com/ubuntu/ xenial main" | sudo tee -a /etc/apt/sources.list
          echo "deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe" | sudo tee -a /etc/apt/sources.list
          sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
          #For gcc-13 (on ubuntu-22.04)
          sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa
          sudo apt-get update
          sudo apt-get install ${{ matrix.compiler }}
      - name: Setup Ubuntu specified (newest) compiler
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.compiler, 'clang-17')
        run: |
          wget https://apt.llvm.org/llvm.sh
          chmod u+x llvm.sh
          sudo ./llvm.sh 17
      - name: Install Windows msys2 prerequisites
        if: startsWith(matrix.os, 'windows')
        uses: msys2/setup-msys2@v2
        with:
          msystem: MINGW64
          update: true
          install: git mingw-w64-x86_64-toolchain automake1.16 automake-wrapper autoconf libtool make mingw-w64-x86_64-json-c mingw-w64-x86_64-crt-git mingw-w64-x86_64-pcre mingw-w64-x86_64-libpcap
      - name: Setup Windows msys2 prerequisites (libgcrypt)
        if: startsWith(matrix.os, 'windows') && startsWith(matrix.gcrypt, '--with-local-libgcrypt')
        run: |
          msys2 -c 'git clone --branch libgpg-error-1.42 https://github.com/gpg/libgpg-error'
          cd libgpg-error
          msys2 -c './autogen.sh'
          msys2 -c './configure -enable-maintainer-mode --enable-static --enable-shared --with-pic --disable-doc --disable-nls'
          msys2 -c 'make'
          msys2 -c 'make install'
          msys2 -c 'cd ..'
          msys2 -c 'rm -rf libgpg-error/'
          msys2 -c 'git clone --branch libgcrypt-1.8.8 https://github.com/gpg/libgcrypt'
          cd libgcrypt
          msys2 -c './autogen.sh'
          msys2 -c './configure -enable-maintainer-mode --enable-static --enable-shared --with-pic --disable-doc'
          msys2 -c 'make'
          msys2 -c 'make install'
          msys2 -c 'cd ..'
          msys2 -c 'rm -rf libgcrypt/'
        env:
          CC:
          CFLAGS:
      - name: Installing MacOS prerequisites
        if: startsWith(matrix.os, 'macOS') && startsWith(matrix.arch, 'x86_64')
        run: |
          brew install coreutils wdiff colordiff autoconf automake libtool pkg-config gettext json-c rrdtool
      - name: Install MacOS Prerequisites (libgcrypt)
        if: startsWith(matrix.os, 'macOS') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.gcrypt, '--with-local-libgcrypt')
        run: |
          brew install libgcrypt
      - name: Install MacOS Prerequisites (libpcre2)
        if: startsWith(matrix.os, 'macOS') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.pcre, '--with-pcre2')
        run: |
          brew install pcre
      - name: Install MacOS Prerequisites (maxminddb)
        if: startsWith(matrix.os, 'macOS') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.maxminddb, '--with-maxminddb')
        run: |
          brew install libmaxminddb
      - name: Configure nDPI on Ubuntu
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64')
        run: |
          AR=${{ matrix.ar }} RANLIB=${{ matrix.ranlib }} ./autogen.sh --enable-option-checking=fatal --enable-debug-messages ${{ matrix.gcrypt }} ${{ matrix.msan }} ${{ matrix.pcre }} ${{ matrix.maxminddb }} --enable-tls-sigs ${{matrix.lto_gold_linker}}
      - name: Configure nDPI on MacOS
        if: startsWith(matrix.os, 'macOS') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.compiler, 'cc')
        run: |
          ./autogen.sh --enable-option-checking=fatal --enable-debug-messages ${{ matrix.gcrypt }} ${{ matrix.msan }} ${{ matrix.pcre }} ${{ matrix.maxminddb }} --enable-tls-sigs
      - name: Configure nDPI on Windows msys2
        if: startsWith(matrix.os, 'windows') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.compiler, 'cc')
        run: |
          msys2 -c './autogen.sh --enable-option-checking=fatal --enable-debug-messages --enable-tls-sigs --disable-npcap ${{ matrix.gcrypt }}'
      - name: Build nDPI on Windows msys2
        if: startsWith(matrix.os, 'windows') && startsWith(matrix.arch, 'x86_64') && startsWith(matrix.compiler, 'cc')
        run: |
          msys2 -c 'make all'
          msys2 -c 'ldd ./example/ndpiReader.exe'
      - name: Build nDPI
        if: startsWith(matrix.arch, 'x86_64') && !startsWith(matrix.os, 'windows') && !startsWith(matrix.os, 'macos-14')
        run: |
          make all
          make -C example ndpiSimpleIntegration
          make -C rrdtool
      - name: Build nDPI (MacOS M1)
        if: startsWith(matrix.os, 'macos-14')
        run: |
          make all
          make -C example ndpiSimpleIntegration
          #There are somes issues with librrd
      - name: Print nDPI long help
        if: startsWith(matrix.arch, 'x86_64') && !startsWith(matrix.os, 'windows')
        run: |
          cd ./example && ./ndpiReader -H
      - name: Install nDPI
        if: startsWith(matrix.arch, 'x86_64') && !startsWith(matrix.os, 'windows')
        run: |
          DESTDIR=/tmp/ndpi make install
          ls -alhHR /tmp/ndpi
      - name: Test nDPI [SYMBOLS]
        if: (startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'mac')) && startsWith(matrix.arch, 'x86_64')
        run: |
          ./utils/check_symbols.sh || { FAILED=$?; echo "::error file=${NDPI_LIB}::Unwanted libc symbols found: ${FAILED}. Please make sure to use only ndpi_malloc/ndpi_calloc/ndpi_realloc/ndpi_free wrapper instead of malloc/calloc/realloc/free."; false; }
        env:
          NDPI_LIB: src/lib/libndpi.a
      - name: Test nDPI [DIFF]
        if: startsWith(matrix.arch, 'x86_64') && !startsWith(matrix.os, 'windows')
        run: |
          ./tests/do.sh
      - name: Test nDPI [UNIT]
        #Some issues with masan + json-c. Disable the test as workaround
        if: startsWith(matrix.arch, 'x86_64') && !startsWith(matrix.os, 'windows') && !startsWith(matrix.msan, '--with-memory-sanitizer') && !startsWith(matrix.os, 'macos-14')
        run: |
          ./tests/do-unit.sh
      - name: Test nDPI [DGA]
        if: startsWith(matrix.arch, 'x86_64') && !startsWith(matrix.os, 'windows')
        run: |
          ./tests/do-dga.sh
      - name: Test nDPI [DIFF] (runs only on windows jobs)
        if: startsWith(matrix.arch, 'x86_64') && startsWith(matrix.os, 'windows')
        run: |
          msys2 -c './tests/do.sh'
      - name: Test nDPI [UNIT] (runs only on windows jobs)
        if: startsWith(matrix.arch, 'x86_64') && startsWith(matrix.os, 'windows')
        run: |
          msys2 -c './tests/do-unit.sh'
      - name: Test nDPI [DGA] (runs only on windows jobs)
        if: startsWith(matrix.arch, 'x86_64') && startsWith(matrix.os, 'windows')
        run: |
          msys2 -c './tests/do-dga.sh'
      - name: Generate/Verify tarball
        if: startsWith(matrix.os, 'ubuntu-latest') && startsWith(matrix.arch, 'x86_64')
        run: |
          make dist
          ./utils/verify_dist_tarball.sh
      - name: Build nDPI [Mingw-w64] (runs only on ubuntu jobs)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'x86_64') && !startsWith(matrix.nBPF, 'nBPF')
        run: |
          make distclean
          ./autogen.sh --enable-option-checking=fatal --enable-debug-messages --enable-tls-sigs --host=x86_64-w64-mingw32
          make all
        env:
          CC:
      - name: Display qemu specified architecture (arm64 - little endian)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'arm64')
        uses: docker://multiarch/ubuntu-core:arm64-bionic
        with:
          args: >
            bash -c
            "uname -a &&
            lscpu | grep Endian
            "
      - name: Configure, compile and test using qemu for the specified architecture (arm64 - little endian)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'arm64')
        uses: docker://multiarch/ubuntu-core:arm64-bionic
        with:
          args: >
            bash -c
            "apt-get -y update &&
            apt-get -y install git wdiff colordiff autoconf automake libtool pkg-config gettext libjson-c-dev flex bison libpcap-dev libgcrypt20-dev libpcre3-dev libmaxminddb-dev rrdtool librrd-dev &&
            git config --global --add safe.directory $(realpath .) &&
            env CC=gcc CFLAGS='-Werror' ./autogen.sh --enable-option-checking=fatal --enable-debug-messages ${{ matrix.gcrypt }} ${{ matrix.msan }} ${{ matrix.pcre }} ${{ matrix.maxminddb }} --enable-tls-sigs &&
            make all &&
            make -C example ndpiSimpleIntegration &&
            make -C rrdtool &&
            make check VERBOSE=1
            "
      - name: Display qemu specified architecture (armhf - little endian)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'armhf')
        uses: docker://multiarch/ubuntu-core:armhf-bionic
        with:
          args: >
            bash -c
            "uname -a &&
            lscpu | grep Endian
            "
      - name: Configure, compile and test using qemu for the specified architecture (armhf - little endian)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 'armhf')
        uses: docker://multiarch/ubuntu-core:armhf-bionic
        with:
          args: >
            bash -c
            "apt-get -y update &&
            apt-get -y install git wdiff colordiff autoconf automake libtool pkg-config gettext libjson-c-dev flex bison libpcap-dev libgcrypt20-dev libpcre3-dev libmaxminddb-dev rrdtool librrd-dev &&
            git config --global --add safe.directory $(realpath .) &&
            env CC=gcc CFLAGS='-Werror' ./autogen.sh --enable-option-checking=fatal --enable-debug-messages ${{ matrix.gcrypt }} ${{ matrix.msan }} ${{ matrix.pcre }} ${{ matrix.maxminddb }} --enable-tls-sigs &&
            make all &&
            make -C example ndpiSimpleIntegration &&
            make -C rrdtool &&
            make check VERBOSE=1
            "
      - name: Display qemu specified architecture (s390x - big endian)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 's390x')
        uses: docker://multiarch/ubuntu-core:s390x-bionic
        with:
          args: >
            bash -c
            "uname -a &&
            lscpu | grep Endian
            "
      - name: Configure and compile using qemu for the specified architecture (s390x - big endian)
        if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.arch, 's390x')
        uses: docker://multiarch/ubuntu-core:s390x-bionic
        with:
          args: >
            bash -c
            "apt-get -y update &&
            apt-get -y install git wdiff colordiff autoconf automake libtool pkg-config gettext libjson-c-dev flex bison libpcap-dev libgcrypt20-dev libpcre3-dev libmaxminddb-dev rrdtool librrd-dev &&
            git config --global --add safe.directory $(realpath .) &&
            env CC=gcc CFLAGS='-Werror' ./autogen.sh --enable-option-checking=fatal --enable-debug-messages ${{ matrix.gcrypt }} ${{ matrix.msan }} ${{ matrix.pcre }} ${{ matrix.maxminddb }} --enable-tls-sigs &&
            make all &&
            make -C example ndpiSimpleIntegration &&
            make -C rrdtool &&
            make check VERBOSE=1
            "