1{ lib, stdenv, fetchFromGitHub, cmake, kernel, installShellFiles, pkg-config
2, luajit, ncurses, perl, jsoncpp, openssl, curl, jq, gcc, elfutils, tbb
3, protobuf, grpc, yaml-cpp, nlohmann_json, re2, zstd, uthash }:
4
5let
6 # Compare with https://github.com/draios/sysdig/blob/0.37.1/cmake/modules/falcosecurity-libs.cmake
7 libsRev = "0.16.0";
8 libsHash = "sha256-aduO2pLj91tRdZ1dW1F1JFEg//SopialXWPd6Oav/u8=";
9
10 # Compare with https://github.com/falcosecurity/libs/blob/0.16.0/cmake/modules/valijson.cmake
11 valijson = fetchFromGitHub {
12 owner = "tristanpenman";
13 repo = "valijson";
14 rev = "v1.0.2";
15 hash = "sha256-wvFdjsDtKH7CpbEpQjzWtLC4RVOU9+D2rSK0Xo1cJqo=";
16 };
17
18 # https://github.com/draios/sysdig/blob/0.37.1/cmake/modules/driver.cmake
19 driver = fetchFromGitHub {
20 owner = "falcosecurity";
21 repo = "libs";
22 rev = "7.1.0+driver";
23 hash = "sha256-FIlnJsNgofGo4HETEEpW28wpC3U9z5AZprwFR5AgFfA=";
24 };
25
26 version = "0.37.1";
27in stdenv.mkDerivation {
28 pname = "sysdig";
29 inherit version;
30
31 src = fetchFromGitHub {
32 owner = "draios";
33 repo = "sysdig";
34 rev = version;
35 hash = "sha256-V1rvQ6ZznL9UiUFW2lyW6gvdoGttOd5kgT2KPQCjmvQ=";
36 };
37
38 nativeBuildInputs = [ cmake perl installShellFiles pkg-config ];
39 buildInputs = [
40 luajit
41 ncurses
42 openssl
43 curl
44 jq
45 gcc
46 elfutils
47 tbb
48 re2
49 protobuf
50 grpc
51 yaml-cpp
52 jsoncpp
53 nlohmann_json
54 zstd
55 uthash
56 ] ++ lib.optionals (kernel != null) kernel.moduleBuildDependencies;
57
58 hardeningDisable = [ "pic" ];
59
60 postUnpack = ''
61 cp -r ${
62 fetchFromGitHub {
63 owner = "falcosecurity";
64 repo = "libs";
65 rev = libsRev;
66 hash = libsHash;
67 }
68 } libs
69 chmod -R +w libs
70
71 substituteInPlace libs/userspace/libscap/libscap.pc.in libs/userspace/libsinsp/libsinsp.pc.in \
72 --replace-fail "\''${prefix}/@CMAKE_INSTALL_LIBDIR@" "@CMAKE_INSTALL_FULL_LIBDIR@" \
73 --replace-fail "\''${prefix}/@CMAKE_INSTALL_INCLUDEDIR@" "@CMAKE_INSTALL_FULL_INCLUDEDIR@"
74
75 cp -r ${driver} driver-src
76 chmod -R +w driver-src
77
78 cmakeFlagsArray+=(
79 "-DFALCOSECURITY_LIBS_SOURCE_DIR=$(pwd)/libs"
80 "-DDRIVER_SOURCE_DIR=$(pwd)/driver-src/driver"
81 )
82 '';
83
84 cmakeFlags = [
85 "-DUSE_BUNDLED_DEPS=OFF"
86 "-DSYSDIG_VERSION=${version}"
87 "-DUSE_BUNDLED_B64=OFF"
88 "-DUSE_BUNDLED_TBB=OFF"
89 "-DUSE_BUNDLED_RE2=OFF"
90 "-DUSE_BUNDLED_JSONCPP=OFF"
91 "-DCREATE_TEST_TARGETS=OFF"
92 "-DVALIJSON_INCLUDE=${valijson}/include"
93 "-DUTHASH_INCLUDE=${uthash}/include"
94 ] ++ lib.optional (kernel == null) "-DBUILD_DRIVER=OFF";
95
96 env.NIX_CFLAGS_COMPILE =
97 # fix compiler warnings been treated as errors
98 "-Wno-error";
99
100 preConfigure = ''
101 if ! grep -q "${libsRev}" cmake/modules/falcosecurity-libs.cmake; then
102 echo "falcosecurity-libs checksum needs to be updated!"
103 exit 1
104 fi
105 cmakeFlagsArray+=(-DCMAKE_EXE_LINKER_FLAGS="-ltbb -lcurl -lzstd -labsl_synchronization")
106 '' + lib.optionalString (kernel != null) ''
107 export INSTALL_MOD_PATH="$out"
108 export KERNELDIR="${kernel.dev}/lib/modules/${kernel.modDirVersion}/build"
109 '';
110
111 postInstall = ''
112 # Fix the bash completion location
113 installShellCompletion --bash $out/etc/bash_completion.d/sysdig
114 rm $out/etc/bash_completion.d/sysdig
115 rmdir $out/etc/bash_completion.d
116 rmdir $out/etc
117 '' + lib.optionalString (kernel != null) ''
118 make install_driver
119 kernel_dev=${kernel.dev}
120 kernel_dev=''${kernel_dev#${builtins.storeDir}/}
121 kernel_dev=''${kernel_dev%%-linux*dev*}
122 if test -f "$out/lib/modules/${kernel.modDirVersion}/extra/scap.ko"; then
123 sed -i "s#$kernel_dev#................................#g" $out/lib/modules/${kernel.modDirVersion}/extra/scap.ko
124 else
125 for i in $out/lib/modules/${kernel.modDirVersion}/{extra,updates}/scap.ko.xz; do
126 if test -f "$i"; then
127 xz -d $i
128 sed -i "s#$kernel_dev#................................#g" ''${i%.xz}
129 xz -9 ''${i%.xz}
130 fi
131 done
132 fi
133 '';
134
135 meta = {
136 description =
137 "A tracepoint-based system tracing tool for Linux (with clients for other OSes)";
138 license = with lib.licenses; [ asl20 gpl2 mit ];
139 maintainers = with lib.maintainers; [ raskin ];
140 platforms = [ "x86_64-linux" ] ++ lib.platforms.darwin;
141 broken = kernel != null && ((lib.versionOlder kernel.version "4.14") || kernel.isHardened || kernel.isZen);
142 homepage = "https://sysdig.com/opensource/";
143 downloadPage = "https://github.com/draios/sysdig/releases";
144 };
145}