feat(make): sign more generated binaries (#330)
* doc(make): add not about qemu-user-static While still investigating https://github.com/ooni/probe/issues/1466 * feat(make): sign more generated binaries While there, fix an annoying bug where the context manager was suppressing exceptions that occurred. Work part of https://github.com/ooni/probe/issues/1466.
This commit is contained in:
parent
6a998545e9
commit
0f98caf3b4
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -2,7 +2,6 @@
|
||||||
/*.jsonl
|
/*.jsonl
|
||||||
/*.tar.gz
|
/*.tar.gz
|
||||||
/*.zip
|
/*.zip
|
||||||
/.vscode
|
|
||||||
/apitool
|
/apitool
|
||||||
/apitool.exe
|
/apitool.exe
|
||||||
/coverage.cov
|
/coverage.cov
|
||||||
|
|
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"python.formatting.provider": "black"
|
||||||
|
}
|
3
CLI/darwin/amd64/.gitignore
vendored
3
CLI/darwin/amd64/.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/ooniprobe
|
|
||||||
/miniooni
|
/miniooni
|
||||||
|
/ooniprobe
|
||||||
|
/ooniprobe.asc
|
||||||
|
|
3
CLI/darwin/arm64/.gitignore
vendored
3
CLI/darwin/arm64/.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/ooniprobe
|
|
||||||
/miniooni
|
/miniooni
|
||||||
|
/ooniprobe
|
||||||
|
/ooniprobe.asc
|
||||||
|
|
3
CLI/linux/386/.gitignore
vendored
3
CLI/linux/386/.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/ooniprobe
|
|
||||||
/miniooni
|
/miniooni
|
||||||
|
/ooniprobe
|
||||||
|
/ooniprobe.asc
|
||||||
|
|
3
CLI/linux/amd64/.gitignore
vendored
3
CLI/linux/amd64/.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/ooniprobe
|
|
||||||
/miniooni
|
/miniooni
|
||||||
|
/ooniprobe
|
||||||
|
/ooniprobe.asc
|
||||||
|
|
2
CLI/linux/arm/.gitignore
vendored
2
CLI/linux/arm/.gitignore
vendored
|
@ -1 +1,3 @@
|
||||||
/miniooni
|
/miniooni
|
||||||
|
/ooniprobe
|
||||||
|
/ooniprobe.asc
|
||||||
|
|
1
CLI/linux/arm64/.gitignore
vendored
1
CLI/linux/arm64/.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/miniooni
|
/miniooni
|
||||||
/ooniprobe
|
/ooniprobe
|
||||||
|
/ooniprobe.asc
|
||||||
|
|
3
CLI/windows/386/.gitignore
vendored
3
CLI/windows/386/.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/ooniprobe.exe
|
|
||||||
/miniooni.exe
|
/miniooni.exe
|
||||||
|
/ooniprobe.exe
|
||||||
|
/ooniprobe.exe.asc
|
||||||
|
|
3
CLI/windows/amd64/.gitignore
vendored
3
CLI/windows/amd64/.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/ooniprobe.exe
|
|
||||||
/miniooni.exe
|
/miniooni.exe
|
||||||
|
/ooniprobe.exe
|
||||||
|
/ooniprobe.exe.asc
|
||||||
|
|
132
make
132
make
|
@ -227,7 +227,7 @@ The third form of the command prints this help screen.
|
||||||
if key in ("-h", "--help"):
|
if key in ("-h", "--help"):
|
||||||
self._usage()
|
self._usage()
|
||||||
if key == "-l":
|
if key == "-l":
|
||||||
sys.stdout.write("{}\n".format(json.dumps(targets, indent=4)))
|
sys.stdout.write("{}\n".format(json.dumps(sorted(targets), indent=4)))
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
if key == "-n":
|
if key == "-n":
|
||||||
self._dry_run = True
|
self._dry_run = True
|
||||||
|
@ -451,9 +451,9 @@ class Environ:
|
||||||
def __exit__(self, type: Any, value: Any, traceback: Any) -> bool:
|
def __exit__(self, type: Any, value: Any, traceback: Any) -> bool:
|
||||||
if self._prev is None:
|
if self._prev is None:
|
||||||
self._engine.unsetenv(self._key)
|
self._engine.unsetenv(self._key)
|
||||||
return True
|
return False # progagate exc
|
||||||
self._engine.setenv(self._key, self._prev)
|
self._engine.setenv(self._key, self._prev)
|
||||||
return True
|
return False # progagate exc
|
||||||
|
|
||||||
|
|
||||||
class AugmentedPath(Environ):
|
class AugmentedPath(Environ):
|
||||||
|
@ -764,6 +764,15 @@ class OONIMKAllAAR:
|
||||||
engine.run(cmdline)
|
engine.run(cmdline)
|
||||||
|
|
||||||
|
|
||||||
|
def sign(engine: Engine, filepath: str) -> str:
|
||||||
|
"""sign signs the given filepath using pgp and returns
|
||||||
|
the filepath of the signature file."""
|
||||||
|
engine.require("gpg")
|
||||||
|
user = "simone@openobservatory.org"
|
||||||
|
engine.run(["gpg", "-abu", user, filepath])
|
||||||
|
return filepath + ".asc"
|
||||||
|
|
||||||
|
|
||||||
class BundleJAR:
|
class BundleJAR:
|
||||||
"""BundleJAR creates ./MOBILE/android/bundle.jar."""
|
"""BundleJAR creates ./MOBILE/android/bundle.jar."""
|
||||||
|
|
||||||
|
@ -812,18 +821,10 @@ class BundleJAR:
|
||||||
"oonimkall-{}-sources.jar".format(version),
|
"oonimkall-{}-sources.jar".format(version),
|
||||||
"oonimkall-{}.pom".format(version),
|
"oonimkall-{}.pom".format(version),
|
||||||
)
|
)
|
||||||
|
allnames: List[str] = []
|
||||||
for name in names:
|
for name in names:
|
||||||
engine.run(
|
allnames.append(name)
|
||||||
[
|
allnames.append(sign(engine, name))
|
||||||
"gpg",
|
|
||||||
"-abu",
|
|
||||||
"simone@openobservatory.org",
|
|
||||||
name,
|
|
||||||
],
|
|
||||||
cwd=os.path.join(".", "MOBILE", "android"),
|
|
||||||
)
|
|
||||||
allnames = [name + ".asc" for name in names]
|
|
||||||
allnames.extend(names)
|
|
||||||
engine.run(
|
engine.run(
|
||||||
[
|
[
|
||||||
"jar",
|
"jar",
|
||||||
|
@ -835,15 +836,23 @@ class BundleJAR:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class Android:
|
class Phony:
|
||||||
"""Android is the toplevel android target."""
|
"""Phony is a phony target that executes one or more other targets."""
|
||||||
|
|
||||||
|
def __init__(self, name: str, depends: List[Target]):
|
||||||
|
self._name = name
|
||||||
|
self._depends = depends
|
||||||
|
|
||||||
def name(self) -> str:
|
def name(self) -> str:
|
||||||
return "android"
|
return self._name
|
||||||
|
|
||||||
def build(self, engine: Engine, options: Options) -> None:
|
def build(self, engine: Engine, options: Options) -> None:
|
||||||
bundlejar = BundleJAR()
|
for dep in self._depends:
|
||||||
bundlejar.build(engine, options)
|
dep.build(engine, options)
|
||||||
|
|
||||||
|
|
||||||
|
# Android is the top-level "android" target
|
||||||
|
ANDROID = Phony("android", [BundleJAR()])
|
||||||
|
|
||||||
|
|
||||||
class OONIMKAllFramework:
|
class OONIMKAllFramework:
|
||||||
|
@ -990,17 +999,8 @@ class OONIMKAllPodspec:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class iOS:
|
# IOS is the top-level "ios" target.
|
||||||
"""iOS is the toplevel ios target."""
|
IOS = Phony("ios", [OONIMKAllFrameworkZip(), OONIMKAllPodspec()])
|
||||||
|
|
||||||
def name(self) -> str:
|
|
||||||
return "ios"
|
|
||||||
|
|
||||||
def build(self, engine: Engine, options: Options) -> None:
|
|
||||||
ooframeworkzip = OONIMKAllFrameworkZip()
|
|
||||||
ooframeworkzip.build(engine, options)
|
|
||||||
oopodspec = OONIMKAllPodspec()
|
|
||||||
oopodspec.build(engine, options)
|
|
||||||
|
|
||||||
|
|
||||||
class MiniOONIDarwinOrWindows:
|
class MiniOONIDarwinOrWindows:
|
||||||
|
@ -1106,23 +1106,17 @@ MINIOONI_TARGETS: List[Target] = [
|
||||||
MiniOONIDarwinOrWindows("windows", "amd64"),
|
MiniOONIDarwinOrWindows("windows", "amd64"),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# MINIOONI is the top-level "miniooni" target.
|
||||||
class MiniOONI:
|
MINIOONI = Phony("miniooni", MINIOONI_TARGETS)
|
||||||
"""MiniOONI is the top-level 'miniooni' target."""
|
|
||||||
|
|
||||||
_name = "miniooni"
|
|
||||||
|
|
||||||
def name(self) -> str:
|
|
||||||
return self._name
|
|
||||||
|
|
||||||
def build(self, engine: Engine, options: Options) -> None:
|
|
||||||
for target in MINIOONI_TARGETS:
|
|
||||||
target.build(engine, options)
|
|
||||||
|
|
||||||
|
|
||||||
class OONIProbeLinux:
|
class OONIProbeLinux:
|
||||||
"""OONIProbeLinux builds ooniprobe for Linux."""
|
"""OONIProbeLinux builds ooniprobe for Linux."""
|
||||||
|
|
||||||
|
# TODO(bassosimone): this works out of the box on macOS and
|
||||||
|
# requires qemu-user-static on Fedora/Debian. I'm not sure what
|
||||||
|
# is the right (set of) command(s) I should be checking for.
|
||||||
|
|
||||||
def __init__(self, goarch: str):
|
def __init__(self, goarch: str):
|
||||||
self._name = os.path.join(".", "CLI", "linux", goarch, "ooniprobe")
|
self._name = os.path.join(".", "CLI", "linux", goarch, "ooniprobe")
|
||||||
self._arch = goarch
|
self._arch = goarch
|
||||||
|
@ -1268,6 +1262,24 @@ class OONIProbeDarwin:
|
||||||
engine.run(cmdline)
|
engine.run(cmdline)
|
||||||
|
|
||||||
|
|
||||||
|
class Sign:
|
||||||
|
"""Sign signs a specific target artefact."""
|
||||||
|
|
||||||
|
def __init__(self, target: Target):
|
||||||
|
self._target = target
|
||||||
|
|
||||||
|
def name(self) -> str:
|
||||||
|
return self._target.name() + ".asc"
|
||||||
|
|
||||||
|
def build(self, engine: Engine, options: Options) -> None:
|
||||||
|
if os.path.isfile(self.name()) and not options.dry_run():
|
||||||
|
log("\n./make: {}: already built".format(self.name()))
|
||||||
|
return
|
||||||
|
self._target.build(engine, options)
|
||||||
|
log("\n./make: building {}...".format(self.name()))
|
||||||
|
sign(engine, self._target.name())
|
||||||
|
|
||||||
|
|
||||||
# OONIPROBE_TARGETS contains all the ooniprobe targets
|
# OONIPROBE_TARGETS contains all the ooniprobe targets
|
||||||
OONIPROBE_TARGETS: List[Target] = [
|
OONIPROBE_TARGETS: List[Target] = [
|
||||||
OONIProbeDarwin("amd64"),
|
OONIProbeDarwin("amd64"),
|
||||||
|
@ -1278,22 +1290,50 @@ OONIPROBE_TARGETS: List[Target] = [
|
||||||
OONIProbeWindows("386"),
|
OONIProbeWindows("386"),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# OONIPROBE_SIGNED_TARGETS contains all the signed ooniprobe targets
|
||||||
|
OONIPROBE_SIGNED_TARGETS: List[Target] = [Sign(x) for x in OONIPROBE_TARGETS]
|
||||||
|
|
||||||
|
# OONIPROBE_RELEASE_DARWIN contains the release darwin targets
|
||||||
|
OONIPROBE_RELEASE_DARWIN = Phony("ooniprobe_release_darwin", [
|
||||||
|
Sign(OONIProbeDarwin("amd64")),
|
||||||
|
Sign(OONIProbeDarwin("arm64")),
|
||||||
|
])
|
||||||
|
|
||||||
|
# OONIPROBE_RELEASE_LINUX contains the release linux targets
|
||||||
|
OONIPROBE_RELEASE_LINUX = Phony("ooniprobe_release_linux", [
|
||||||
|
Sign(OONIProbeLinux("amd64")),
|
||||||
|
Sign(OONIProbeLinux("arm64")),
|
||||||
|
])
|
||||||
|
|
||||||
|
# OONIPROBE_RELEASE_WINDOWS contains the release windows targets
|
||||||
|
OONIPROBE_RELEASE_WINDOWS = Phony("ooniprobe_release_windows", [
|
||||||
|
Sign(OONIProbeWindows("amd64")),
|
||||||
|
Sign(OONIProbeWindows("386")),
|
||||||
|
])
|
||||||
|
|
||||||
# MOBILE_TARGETS contains the top-level mobile targets.
|
# MOBILE_TARGETS contains the top-level mobile targets.
|
||||||
MOBILE_TARGETS: List[Target] = [
|
MOBILE_TARGETS: List[Target] = [
|
||||||
Android(),
|
ANDROID,
|
||||||
iOS(),
|
IOS,
|
||||||
]
|
]
|
||||||
|
|
||||||
# EXTRA_TARGETS contains extra top-level targets.
|
# EXTRA_TARGETS contains extra top-level targets.
|
||||||
EXTRA_TARGETS: List[Target] = [
|
EXTRA_TARGETS: List[Target] = [
|
||||||
MiniOONI(),
|
MINIOONI,
|
||||||
OONIMKAllAAR(),
|
OONIMKAllAAR(),
|
||||||
OONIMKAllFrameworkZip(),
|
OONIMKAllFrameworkZip(),
|
||||||
]
|
]
|
||||||
|
|
||||||
# VISIBLE_TARGETS contains all the visible-from-CLI targets
|
# VISIBLE_TARGETS contains all the visible-from-CLI targets
|
||||||
VISIBLE_TARGETS: List[Target] = (
|
VISIBLE_TARGETS: List[Target] = (
|
||||||
OONIPROBE_TARGETS + MOBILE_TARGETS + EXTRA_TARGETS + MINIOONI_TARGETS
|
OONIPROBE_TARGETS
|
||||||
|
+ OONIPROBE_SIGNED_TARGETS
|
||||||
|
+ MOBILE_TARGETS
|
||||||
|
+ EXTRA_TARGETS
|
||||||
|
+ MINIOONI_TARGETS
|
||||||
|
+ [OONIPROBE_RELEASE_DARWIN]
|
||||||
|
+ [OONIPROBE_RELEASE_LINUX]
|
||||||
|
+ [OONIPROBE_RELEASE_WINDOWS]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user