1*2810ac1bSKiyoung Kim# Building the libcap/{cap.psx} Go packages, and examples. 2*2810ac1bSKiyoung Kim# 3*2810ac1bSKiyoung Kim# Note, we use symlinks to construct a go.mod build friendly tree. The 4*2810ac1bSKiyoung Kim# packages themselves are intended to be (ultimately) found via proxy 5*2810ac1bSKiyoung Kim# as "kernel.org/pub/linux/libs/security/libcap/cap" and 6*2810ac1bSKiyoung Kim# "kernel.org/pub/linux/libs/security/libcap/psx". However, to 7*2810ac1bSKiyoung Kim# validate their use on these paths, we fake such a structure in the 8*2810ac1bSKiyoung Kim# build tree with symlinks and a vendor directory. 9*2810ac1bSKiyoung Kim 10*2810ac1bSKiyoung Kimtopdir=$(realpath ..) 11*2810ac1bSKiyoung Kiminclude $(topdir)/Make.Rules 12*2810ac1bSKiyoung Kim 13*2810ac1bSKiyoung KimIMPORTDIR=kernel.org/pub/linux/libs/security/libcap 14*2810ac1bSKiyoung KimPKGDIR=pkg/$(GOOSARCH)/$(IMPORTDIR) 15*2810ac1bSKiyoung Kim 16*2810ac1bSKiyoung KimDEPS=../libcap/libcap.a ../libcap/libpsx.a 17*2810ac1bSKiyoung KimTESTS=compare-cap try-launching psx-signals mismatch 18*2810ac1bSKiyoung Kim 19*2810ac1bSKiyoung Kimall: PSXGOPACKAGE CAPGOPACKAGE web setid gowns captree captrace 20*2810ac1bSKiyoung Kim 21*2810ac1bSKiyoung Kim$(DEPS): 22*2810ac1bSKiyoung Kim $(MAKE) -C ../libcap all 23*2810ac1bSKiyoung Kim 24*2810ac1bSKiyoung Kim../progs/tcapsh-static: 25*2810ac1bSKiyoung Kim $(MAKE) -C ../progs tcapsh-static 26*2810ac1bSKiyoung Kim 27*2810ac1bSKiyoung Kimvendor/$(IMPORTDIR): 28*2810ac1bSKiyoung Kim mkdir -p "vendor/$(IMPORTDIR)" 29*2810ac1bSKiyoung Kim 30*2810ac1bSKiyoung Kimvendor/modules.txt: vendor/$(IMPORTDIR) 31*2810ac1bSKiyoung Kim echo "# $(IMPORTDIR)/psx v$(GOMAJOR).$(VERSION).$(MINOR)" > vendor/modules.txt 32*2810ac1bSKiyoung Kim echo "$(IMPORTDIR)/psx" >> vendor/modules.txt 33*2810ac1bSKiyoung Kim echo "# $(IMPORTDIR)/cap v$(GOMAJOR).$(VERSION).$(MINOR)" >> vendor/modules.txt 34*2810ac1bSKiyoung Kim echo "$(IMPORTDIR)/cap" >> vendor/modules.txt 35*2810ac1bSKiyoung Kim 36*2810ac1bSKiyoung Kimvendor/$(IMPORTDIR)/psx: vendor/modules.txt 37*2810ac1bSKiyoung Kim ln -sf $(topdir)/psx vendor/$(IMPORTDIR) 38*2810ac1bSKiyoung Kim touch ../psx 39*2810ac1bSKiyoung Kim 40*2810ac1bSKiyoung Kimvendor/$(IMPORTDIR)/cap: vendor/modules.txt 41*2810ac1bSKiyoung Kim ln -sf $(topdir)/cap vendor/$(IMPORTDIR) 42*2810ac1bSKiyoung Kim touch ../cap 43*2810ac1bSKiyoung Kim 44*2810ac1bSKiyoung Kim$(topdir)/libcap/cap_names.h: 45*2810ac1bSKiyoung Kim $(MAKE) -C $(topdir)/libcap cap_names.h 46*2810ac1bSKiyoung Kim 47*2810ac1bSKiyoung Kimgood-names.go: $(topdir)/libcap/cap_names.h vendor/$(IMPORTDIR)/cap mknames.go 48*2810ac1bSKiyoung Kim CC="$(CC)" $(GO) run -mod=vendor mknames.go --header=$< --textdir=$(topdir)/doc/values | gofmt > $@ || rm -f $@ 49*2810ac1bSKiyoung Kim diff -u ../cap/names.go $@ 50*2810ac1bSKiyoung Kim 51*2810ac1bSKiyoung KimPSXGOPACKAGE: vendor/$(IMPORTDIR)/psx ../psx/*.go $(DEPS) 52*2810ac1bSKiyoung Kim touch $@ 53*2810ac1bSKiyoung Kim 54*2810ac1bSKiyoung KimCAPGOPACKAGE: vendor/$(IMPORTDIR)/cap ../cap/*.go good-names.go $(PSXGOPACKAGE) 55*2810ac1bSKiyoung Kim touch $@ 56*2810ac1bSKiyoung Kim 57*2810ac1bSKiyoung Kim# Compiles something with this package to compare it to libcap. This 58*2810ac1bSKiyoung Kim# tests more when run under sudotest (see ../progs/quicktest.sh for that). 59*2810ac1bSKiyoung Kimcompare-cap: compare-cap.go CAPGOPACKAGE 60*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< 61*2810ac1bSKiyoung Kim 62*2810ac1bSKiyoung Kimweb: ../goapps/web/web.go CAPGOPACKAGE 63*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 64*2810ac1bSKiyoung Kimifeq ($(RAISE_GO_FILECAP),yes) 65*2810ac1bSKiyoung Kim $(MAKE) -C ../progs setcap 66*2810ac1bSKiyoung Kim $(SUDO) ../progs/setcap cap_setpcap,cap_net_bind_service=p web 67*2810ac1bSKiyoung Kim @echo "NOTE: RAISED cap_setpcap,cap_net_bind_service ON web binary" 68*2810ac1bSKiyoung Kimendif 69*2810ac1bSKiyoung Kim 70*2810ac1bSKiyoung Kimsetid: ../goapps/setid/setid.go CAPGOPACKAGE PSXGOPACKAGE 71*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 72*2810ac1bSKiyoung Kim 73*2810ac1bSKiyoung Kimgowns: ../goapps/gowns/gowns.go CAPGOPACKAGE 74*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 75*2810ac1bSKiyoung Kim 76*2810ac1bSKiyoung Kimcaptree: ../goapps/captree/captree.go CAPGOPACKAGE 77*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 78*2810ac1bSKiyoung Kim 79*2810ac1bSKiyoung Kimcaptrace: ../goapps/captrace/captrace.go CAPGOPACKAGE 80*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 81*2810ac1bSKiyoung Kim 82*2810ac1bSKiyoung Kimok: ok.go vendor/modules.txt 83*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="0" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< 84*2810ac1bSKiyoung Kim 85*2810ac1bSKiyoung Kimtry-launching: try-launching.go CAPGOPACKAGE ok 86*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< 87*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 88*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@-cgo $< 89*2810ac1bSKiyoung Kimendif 90*2810ac1bSKiyoung Kim 91*2810ac1bSKiyoung Kim# This is a test case developed from the deadlock investigation, 92*2810ac1bSKiyoung Kim# https://github.com/golang/go/issues/50113 . Note the psx-fd.go code 93*2810ac1bSKiyoung Kim# works when compiled CGO_ENABLED=1, but deadlocks when compiled 94*2810ac1bSKiyoung Kim# CGO_ENABLED=0. This is true for go1.16 and go1.17. The go1.18 95*2810ac1bSKiyoung Kim# release fixed this by rewriting the AllThreadsSyscall support, but 96*2810ac1bSKiyoung Kim# the large change was not backported. (See noted bug for a much 97*2810ac1bSKiyoung Kim# smaller patch for this issue on those older releases.) 98*2810ac1bSKiyoung Kimpsx-fd: psx-fd.go PSXGOPACKAGE 99*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 100*2810ac1bSKiyoung Kim 101*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 102*2810ac1bSKiyoung Kimpsx-fd-cgo: psx-fd.go PSXGOPACKAGE 103*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 104*2810ac1bSKiyoung Kimendif 105*2810ac1bSKiyoung Kim 106*2810ac1bSKiyoung Kimpsx-signals: psx-signals.go PSXGOPACKAGE 107*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< 108*2810ac1bSKiyoung Kim 109*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 110*2810ac1bSKiyoung Kimpsx-signals-cgo: psx-signals.go PSXGOPACKAGE 111*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 112*2810ac1bSKiyoung Kimendif 113*2810ac1bSKiyoung Kim 114*2810ac1bSKiyoung Kimb210613: b210613.go CAPGOPACKAGE 115*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< 116*2810ac1bSKiyoung Kim 117*2810ac1bSKiyoung Kimb215283: b215283.go CAPGOPACKAGE 118*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< 119*2810ac1bSKiyoung Kim 120*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 121*2810ac1bSKiyoung Kimb215283-cgo: b215283.go CAPGOPACKAGE 122*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 123*2810ac1bSKiyoung Kimendif 124*2810ac1bSKiyoung Kim 125*2810ac1bSKiyoung Kimmismatch: mismatch.go PSXGOPACKAGE 126*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< 127*2810ac1bSKiyoung Kim 128*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 129*2810ac1bSKiyoung Kimmismatch-cgo: mismatch.go CAPGOPACKAGE 130*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< 131*2810ac1bSKiyoung Kimendif 132*2810ac1bSKiyoung Kim 133*2810ac1bSKiyoung Kimtest: setid gowns captree psx-fd $(TESTS) 134*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) test -mod=vendor $(IMPORTDIR)/psx 135*2810ac1bSKiyoung Kim CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) test -mod=vendor $(IMPORTDIR)/cap 136*2810ac1bSKiyoung Kim LD_LIBRARY_PATH=../libcap ./compare-cap 137*2810ac1bSKiyoung Kim ./psx-signals 138*2810ac1bSKiyoung Kim ./mismatch || exit 0 ; exit 1 139*2810ac1bSKiyoung Kim timeout 5 ./psx-fd || echo "this is a known Go bug" 140*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 141*2810ac1bSKiyoung Kim $(MAKE) psx-signals-cgo mismatch-cgo psx-fd-cgo 142*2810ac1bSKiyoung Kim ./psx-signals-cgo 143*2810ac1bSKiyoung Kim ./mismatch-cgo || exit 0 ; exit 1 144*2810ac1bSKiyoung Kim ./psx-fd-cgo 145*2810ac1bSKiyoung Kimendif 146*2810ac1bSKiyoung Kim ./setid --caps=false 147*2810ac1bSKiyoung Kim ./gowns -- -c "echo gowns runs" 148*2810ac1bSKiyoung Kim ./captree 0 149*2810ac1bSKiyoung Kim 150*2810ac1bSKiyoung Kim# Note, the user namespace doesn't require sudo, but I wanted to avoid 151*2810ac1bSKiyoung Kim# requiring that the hosting kernel supports user namespaces for the 152*2810ac1bSKiyoung Kim# regular test case. 153*2810ac1bSKiyoung Kimsudotest: test ../progs/tcapsh-static b210613 b215283 154*2810ac1bSKiyoung Kim ../progs/tcapsh-static --has-b=cap_sys_admin || exit 0 && ./gowns --ns -- -c "echo gowns runs with user namespace" 155*2810ac1bSKiyoung Kim ./try-launching 156*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 157*2810ac1bSKiyoung Kim ./try-launching-cgo 158*2810ac1bSKiyoung Kimendif 159*2810ac1bSKiyoung Kim $(SUDO) ./try-launching 160*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 161*2810ac1bSKiyoung Kim $(SUDO) ./try-launching-cgo 162*2810ac1bSKiyoung Kimendif 163*2810ac1bSKiyoung Kim $(SUDO) ../progs/tcapsh-static --cap-uid=$$(id -u) --caps="cap_setpcap=ep" --iab="^cap_setpcap" -- -c ./b210613 164*2810ac1bSKiyoung Kim $(SUDO) ./b215283 165*2810ac1bSKiyoung Kimifeq ($(CGO_REQUIRED),0) 166*2810ac1bSKiyoung Kim $(MAKE) b215283-cgo 167*2810ac1bSKiyoung Kim $(SUDO) ./b215283-cgo 168*2810ac1bSKiyoung Kimendif 169*2810ac1bSKiyoung Kim 170*2810ac1bSKiyoung Kim 171*2810ac1bSKiyoung Kim# As of libcap-2.55 We stopped installing the cap and psx packages as 172*2810ac1bSKiyoung Kim# part of the install. Most distribution's packagers skip the Go 173*2810ac1bSKiyoung Kim# builds, so it was not well used any way. The new hotness is to just 174*2810ac1bSKiyoung Kim# use Go modules and download the packages from a tagged release in 175*2810ac1bSKiyoung Kim# the git repository. For an example of how to do this from scratch: 176*2810ac1bSKiyoung Kim# 177*2810ac1bSKiyoung Kim# https://sites.google.com/site/fullycapable/getting-started-with-go/building-go-programs-that-manipulate-capabilities 178*2810ac1bSKiyoung Kim# 179*2810ac1bSKiyoung Kim# For those brave souls that do include the Go build (testing) as part 180*2810ac1bSKiyoung Kim# of their packaging, we reward them with a copy of the captree 181*2810ac1bSKiyoung Kim# utility! 182*2810ac1bSKiyoung Kiminstall: all 183*2810ac1bSKiyoung Kim mkdir -p -m 0755 $(FAKEROOT)$(SBINDIR) 184*2810ac1bSKiyoung Kim install -m 0755 captree $(FAKEROOT)$(SBINDIR) 185*2810ac1bSKiyoung Kim 186*2810ac1bSKiyoung Kimclean: 187*2810ac1bSKiyoung Kim rm -f *.o *.so *~ mknames ok good-names.go 188*2810ac1bSKiyoung Kim rm -f web setid gowns captree captrace 189*2810ac1bSKiyoung Kim rm -f compare-cap try-launching try-launching-cgo 190*2810ac1bSKiyoung Kim rm -f $(topdir)/cap/*~ $(topdir)/psx/*~ 191*2810ac1bSKiyoung Kim rm -f b210613 b215283 b215283-cgo psx-signals psx-signals-cgo 192*2810ac1bSKiyoung Kim rm -f mismatch mismatch-cgo psx-fd psx-fd-cgo 193*2810ac1bSKiyoung Kim rm -fr vendor CAPGOPACKAGE PSXGOPACKAGE go.sum 194