summary refs log tree commit diff
path: root/ripple/tools
diff options
context:
space:
mode:
authorV <v@unfathomable.blue>2021-07-10 20:17:48 +0200
committerV <v@unfathomable.blue>2021-07-10 20:17:48 +0200
commitcab3c5a1a0f81eaac3cb8d4f54f0515b065160ea (patch)
tree34be72be2fb706f1236de1d4de6814d37edcab3e /ripple/tools
parent9040519a9f03faef5ac6abea2146f28e0036963c (diff)
ripple: move tools to their own directory
Change-Id: I693b9b9c5b9aff8c96b1b81f1ff7b7f2b92eabcb
Diffstat (limited to 'ripple/tools')
-rwxr-xr-xripple/tools/driver.pl69
-rw-r--r--ripple/tools/fakefakeroot/.gitignore5
-rw-r--r--ripple/tools/fakefakeroot/PKGBUILD17
-rwxr-xr-xripple/tools/fakefakeroot/fakefakeroot.sh17
4 files changed, 108 insertions, 0 deletions
diff --git a/ripple/tools/driver.pl b/ripple/tools/driver.pl
new file mode 100755
index 0000000..7a8d164
--- /dev/null
+++ b/ripple/tools/driver.pl
@@ -0,0 +1,69 @@
+#! /usr/bin/perl
+# SPDX-FileCopyrightText: edef <edef@unfathomable.blue>
+# SPDX-License-Identifier: OSL-3.0
+
+use strict;
+use POSIX qw(mkfifo);
+
+@ARGV or die "Usage: $0 PROGRAM [ARG]... 2> [LOG FILE]";
+die "bpftrace does not support spaces in argv" if grep {/ /} @ARGV;
+
+unlink(my $fifo = "tracepipe");
+mkfifo($fifo, 0600) or die;
+
+my $script = do { local $/; <DATA> };
+defined(my $pid = fork) or die;
+
+if (!$pid) {
+    open(STDERR, ">&", STDOUT) or die;
+    exec(
+        'systemd-run', '--user', '--scope', '--',
+        # NOTE: this expects bpftrace to be SUID-root,
+        # and relies on shells dropping euid
+        'bpftrace', '-o', $fifo, '-e', $script, '-c',
+        join(' ', @ARGV)
+    ) or die;
+}
+
+my %count;
+
+# TODO(edef): if bpftrace fails, the FIFO will never open
+open(TRACE, '<', $fifo) or die;
+while (<TRACE>) {
+    chomp;
+    next if /^Attaching \d+ probes[.][.][.]$/ or /^$/;
+    /^@\[tracepoint:syscalls:sys_enter_(\w+), (.+)\]: (\d+)$/ or die $_;
+    $count{$1}{$2} += $3;
+}
+
+waitpid $pid, 0;
+
+foreach my $comm (sort keys %count) {
+    die "unhandled: $comm" if $comm =~ /\s/;
+    my $comm_count = $count{$comm};
+    foreach my $sys (sort keys %$comm_count) {
+        my $n = $comm_count->{$sys};
+        print STDERR "$comm\t$sys\t$n\n";
+    }
+}
+
+__DATA__
+BEGIN {
+    @cgroup = cgroup;
+    @self = pid;
+}
+
+tracepoint:syscalls:sys_enter_* /cgroup == @cgroup && pid != @self/ {
+    @[probe, comm] = count();
+}
+
+interval:s:1 {
+    print(@);
+    clear(@);
+}
+
+tracepoint:sched:sched_process_exit /tid == cpid/ {
+    clear(@cgroup);
+    clear(@self);
+    exit();
+}
diff --git a/ripple/tools/fakefakeroot/.gitignore b/ripple/tools/fakefakeroot/.gitignore
new file mode 100644
index 0000000..b91c0cb
--- /dev/null
+++ b/ripple/tools/fakefakeroot/.gitignore
@@ -0,0 +1,5 @@
+# SPDX-FileCopyrightText: edef <edef@unfathomable.blue>
+# SPDX-License-Identifier: OSL-3.0
+/*.pkg.tar.*
+/src/
+/pkg/
diff --git a/ripple/tools/fakefakeroot/PKGBUILD b/ripple/tools/fakefakeroot/PKGBUILD
new file mode 100644
index 0000000..22cdb41
--- /dev/null
+++ b/ripple/tools/fakefakeroot/PKGBUILD
@@ -0,0 +1,17 @@
+# SPDX-FileCopyrightText: edef <edef@unfathomable.blue>
+# SPDX-License-Identifier: OSL-3.0
+pkgname=fakefakeroot
+pkgver=0
+pkgrel=0
+pkgdesc='fakeroot shim'
+arch=('any')
+license=('OSL-3.0')
+depends=('bash')
+provides=('fakeroot')
+conflicts=('fakeroot')
+source=('./fakefakeroot.sh')
+b2sums=('SKIP')
+
+package() {
+	install -Dm 0755 fakefakeroot.sh $pkgdir/usr/bin/fakeroot
+}
diff --git a/ripple/tools/fakefakeroot/fakefakeroot.sh b/ripple/tools/fakefakeroot/fakefakeroot.sh
new file mode 100755
index 0000000..0f6ca7c
--- /dev/null
+++ b/ripple/tools/fakefakeroot/fakefakeroot.sh
@@ -0,0 +1,17 @@
+#! /bin/bash
+# SPDX-FileCopyrightText: edef <edef@unfathomable.blue>
+# SPDX-License-Identifier: OSL-3.0
+
+if [ "$*" = "-v" ]; then
+    echo fakefakeroot
+    exit 0
+fi
+
+if [ "$1" != "--" ]; then
+    echo "usage: $0 -- PROGRAM [ARG]..." >&2
+    exit 255
+fi
+
+export FAKEROOTKEY="double-fake-root"
+
+shift; exec "$@"