nfqdep = dependency('libnetfilter_queue', required: false) ssl = dependency('openssl', required: true) # MD5 per hash processo jsondep = dependency('nlohmann_json', required: true) threads = dependency('threads', required: true) # ── libbpf (opzionale) ──────────────────────────────────────────────────────── # Se libbpf >= 0.7 è presente, compila con eBPF support. # Se assente, EBPFMon.cpp compila in modalità stub no-op (BSC_HAS_EBPF non def). libbpfdep = dependency('libbpf', required: false, version: '>= 0.7') has_ebpf = libbpfdep.found() ebpf_args = has_ebpf ? ['-DBSC_HAS_EBPF=1'] : [] if has_ebpf message('eBPF support: ABILITATO (libbpf trovato)') else message('eBPF support: DISABILITATO (libbpf non trovato — installare libbpf-dev)') endif # ── Compilazione programma BPF kernel-side ──────────────────────────────────── # Richiede: clang, kernel headers con BTF (linux-headers-$(uname -r)) # Output: bsc_ebpf.o → installato in /usr/lib/bastionguard-sc/ if has_ebpf clang = find_program('clang', required: false) bpftool = find_program('bpftool', required: false) if clang.found() # Genera vmlinux.h dal BTF del kernel in esecuzione (richiede bpftool) # Se bpftool non è disponibile usiamo il vmlinux.h precompilato nel sorgente. vmlinux_h_dir = meson.current_source_dir() / 'ebpf' if bpftool.found() vmlinux_h = custom_target('vmlinux_h', output : 'vmlinux.h', command : [ 'sh', '-c', bpftool.full_path() + ' btf dump file /sys/kernel/btf/vmlinux format c > @OUTPUT@', ], build_by_default : true, ) vmlinux_dep = [vmlinux_h] # Directory del build dove meson deposita vmlinux.h generato vmlinux_inc = meson.current_build_dir() else # Fallback: il repo deve contenere un vmlinux.h precompilato in ebpf/ warning('bpftool non trovato — uso vmlinux.h precompilato in ebpf/') vmlinux_h = [] vmlinux_dep = [] vmlinux_inc = vmlinux_h_dir endif bsc_ebpf_o = custom_target('bsc_ebpf_o', input : 'ebpf/bsc_ebpf.c', output : 'bsc_ebpf.o', depends : vmlinux_dep, command : [ clang, '-O2', '-target', 'bpf', '-D__TARGET_ARCH_x86', '-g', '-Wno-missing-declarations', # forward decl interne di vmlinux.h '-I' + vmlinux_inc, '-I' + vmlinux_h_dir, '-I/usr/include/bpf', '-c', '@INPUT@', '-o', '@OUTPUT@', ], build_by_default : true, install : true, install_dir : get_option('prefix') / 'lib' / 'bastionguard-sc', ) else warning('clang non trovato — bsc_ebpf.o non compilato. ' + 'eBPF attivo solo se bsc_ebpf.o precompilato è installato.') endif endif cpp_sources = [ 'src/main.cpp', 'src/model/Connection.cpp', 'src/logging/Logger.cpp', 'src/config/Config.cpp', 'src/rule/Rule.cpp', 'src/stats/Statistics.cpp', 'src/proc/ProcMon.cpp', 'src/net/SocketSnapshot.cpp', 'src/net/SockDiag.cpp', 'src/netlink/ProcEventMonitor.cpp', 'src/net/DnsResolver.cpp', 'src/netfilter/NFQueue.cpp', 'src/fw/Firewall.cpp', 'src/task/TaskRunner.cpp', 'src/ui/UIClient.cpp', 'src/ebpf/EBPFMon.cpp', # no-op stub se BSC_HAS_EBPF non definito 'src/service/DaemonService.cpp', ] inc = include_directories('include') executable('bsc-daemon', cpp_sources, include_directories : [inc, common_include_dir], dependencies : [ssl, jsondep, threads, nfqdep, libbpfdep], cpp_args : (nfqdep.found() ? ['-DBSC_HAS_NFQ=1'] : []) + ebpf_args, install : true, install_dir : get_option('sbindir'), )