OONI minioonirunv2
Author | @bassosimone |
Last-Updated | 2022-08-31 |
Reviewed-by | @hellais |
Status | approved |
The official spec for OONI Run v2 is under review as ooni/spec#249. We want to start experimenting
with OONI Run v2 before such a spec has been finalized.
This document, in particular, describes a “mini” OONI Run v2 where
miniooni
users can run arbitrary OONI Run v2 “descriptors” (see below
for a definition).
When ooni/spec#249 is merged,
it will automatically supersede this document. The main idea of this
document is just to explain the subset of OONI Run v2 implemented inside
the miniooni
research tool until we have a complete spec.
Overview
OONI Run v1 links do not support passing options to experiments and often times are longer than the maximum message size on, for example, WhatsApp and Telegram. To fix these issues, we’re designing OONI Run v2.
The general idea is the following:
-
there is a mobile (or desktop) OONI Run v2 deeplink;
-
the deeplink eventually resolves to a URL;
-
fetching the URL returns a JSON document telling the OONI engine what to measure, called descriptor.
This document only focuses on running arbitrary v2 descriptors
for research purposes using miniooni
.
OONI Run v2 descriptor
We use this definition of the descriptor (which we deemed to be forward compatible with the final descriptor format):
where "nettests"
is an array of objects like this:
where:
-
"inputs"
is an optional list of input strings for the nettest like the ones you would normally pass tominiooni
using-i
. -
"options"
is an optionalmap[string]any
where the key is a name of an option you can pass to aminiooni
experiment using-O NAME=VALUE
andvalue
is the corresponding value. The type of the value should be the type of the original field inside of the experiment’s options, which you can see with./miniooni <experiment> --help
. -
"test_name"
is the<experiment>
string you would use in./miniooni <experiment>
.
(For historical reasons, “experiment”, “test”, and “nettest” are synonymous.)
Functionality
A miniooni
user could run an arbitrary OONI Run v2 descriptor stored at a given URL
by invoking the oonirun
subcommand and passing the URL using -i
. The user could
specify an abitrary number of descriptor URLs. For example:
The OONI engine will fetch each descriptor sequentially and execute the code it
would execute if the user ran ./miniooni
from the command line
with the specified experiment name, the given
options and inputs.
The OONI engine stores the content of each descriptor inside a cache on disk
inside the $OONI_HOME
of miniooni
(generally $HOME/.miniooni/
).
Conceptually, this cache is a map from the descriptor URL to the latest known content
of the descriptor. (The actual implementation may differ.)
On the first run, or when the descriptor has changed, miniooni
refuses to run,
shows what changed, and asks the user for confirmation.
There’s also a mechanism to bypass asking for confirmation that explicitly requires a
user to add -y
or --yes
to the command line to automatically answer “yes” to
all questions. (This is useful when, for example, you’re running your own descriptors.)