OONI Probe CLI v3.20.0
This is a stable release. On a high-level, this is what changed since 3.19:
- ✨ Web Connectivity v0.5 is nearly production ready
- ✨ Initial support for Go 1.21
- 🚧 Scripting to make research faster
- 🚧 Refactoring and improvements for the experimental
dslx
package - 🚧 Release engineering (aka keeping the lights on)
- 🐛 Miscellaneous bug fixes
More in detail:
✨ Web Connectivity v0.5 is nearly production ready
We implemented the minipipeline
package, borrowing the https://github.com/ooni/data design, to make sure that Web Connectivity v0.5 produces the same top-level keys produced by Web Connectivity v0.4 for our GVisor-based QA test suite. Because of that, we're now ready to start enabling Web Connectivity v0.5 for all users for limited periods of time using the check-in API's feature flags. By doing this, we would be able to more thoroughly A/B test v0.4 and v0.5. In turn, this would allow us to fix additional bugs and hopefully v0.5 would be the default implementation of Web Connectivity in the 3.21 or 3.22 release cycles.
Related commits
- feat: minipipeline to analyze measurements by @bassosimone in #1393
- feat: qatool to run webconnectivity lte QA by @bassosimone in #1394
- fix(minipipeline): DNSLookupFailures must be a slice by @bassosimone in #1395
- refactor(webconnectivitylte): {Append,Prepend}Requests by @bassosimone in #1396
- feat(webconnectivityqa): add more QA tests by @bassosimone in #1397
- fix(webconnectivitylte): always save "connect" network events by @bassosimone in #1398
- chore(webconnectivitylte): sync {cleartext,secure}flow.go by @bassosimone in #1399
- cleanup(minipipeline): factor code into utility functions by @bassosimone in #1400
- fix(minipipeline/analysis): distinguish between None and empty by @bassosimone in #1401
- feat(minipipeline): introduce "classic" observations filtering by @bassosimone in #1402
- feat: add and process depth and fetch_body tags by @bassosimone in #1403
- chore: regenerate testdata for minipipeline by @bassosimone in #1404
- fix(minipipeline): include probe/control resolved addrs by @bassosimone in #1405
- cleanup(minipipeline/analysis): move utilities in other files by @bassosimone in #1406
- fix(minipipeline): change DNSDiff algorithm by @bassosimone in #1407
- refactor(minipipeline): change DNSDiff foundations by @bassosimone in #1408
- refactor(minipipeline): adjust how we compute DNS failures by @bassosimone in #1409
- refactor(minipipeline): adjust how we compute TCP and TLS anomalies by @bassosimone in #1410
- feat(minipipeline): distinguish failure by operation by @bassosimone in #1411
- refactor(minipipeline): tweak how we detect HTTP failures by @bassosimone in #1412
- refactor(minipipeline): separate unexplained tcp and tls failures by @bassosimone in #1413
- refactor(minipipeline): tweak HTTP code by @bassosimone in #1414
- feat(minipipeline): add metrics required by LTE compat analysis mode by @bassosimone in #1415
- cleanup(minipipeline): zap DNSPossiblyNonexistingDomains metric by @bassosimone in #1416
- fix(minipipeline): don't emit fetch_body=false in classic mode by @bassosimone in #1418
- fix(minipipeline): set control expectation for all observations by @bassosimone in #1419
- feat(minipipeline): implement linear analysis by @bassosimone in #1417
- feat(webconnectivitylte): introduce classic analysis by @bassosimone in #1420
- feat: make sure LTE and v0.4 emit the same test keys by @bassosimone in #1392
- doc(webconnectivitylte): document "orig" HTTP analysis bug by @bassosimone in #1422
✨ Initial support for Go 1.21
Community members asked us to add Go 1.21 support. It is now possible to compile OONI Probe using Go 1.21. Because Psiphon does not support Go 1.21 yet, when you're building using Go 1.21, it would not be possible to use Psiphon as a circumvention tunnel or to run the Psiphon experiment. (Psiphon should finish migrating to Go 1.21 soon, so OONI Probe 3.21 should have full Go 1.21 support.)
Related commits
- feat: allow go1.21 builds by @bassosimone in #1424
🚧 Scripting to make research faster
As part of our richer input efforts (https://github.com/ooni/2023-05-richer-input), we developed DSL code designed to executed from a scripting language environment. We have been also using this code for research purposes, to address cases where we need to iterate faster and deploying new binaries frequently slows down the process significantly. In this release, we are starting to merge part of this code into this repository and to expose it (as an experimental preview) to the miniooni
tool. Namely, we have merged the underlying DSL engine and the corresponding bindings for the https://github.com/dop251/goja JavaScript engine. We will add additional documentation about this functionality in the next release cycles, as we continue experimenting and using it for research. In the meanwhile, see https://github.com/bassosimone/2023-12-09-ooni-javascript/ for additional information and details about this experimental feature.
Related commits
- feat(miniooni): minimal JavaScript-ing capabilities by @bassosimone in #1437
🚧 Refactoring and improvements for the experimental dslx
package
We continued working on our experimental internal DSL prototype, by trying to simplify and make it suitable for production usage. We also used some of the refactored code in the scripting functionality implementation described above.
Related commits
- refactor(dslx): allow running w/o measurexlite as the backend by @bassosimone in #1376
- cleanup(dslx): use model.UnderlyingNetwork for testing by @bassosimone in #1377
- refactor(dslx): unify TLS and QUIC handshake options by @bassosimone in #1378
- refactor(dslx): start making functions stateless by @bassosimone in #1379
- refactor(dslx): prepare for making HTTPRequest stateless by @bassosimone in #1380
- refactor(dslx): finish making funcs stateless by @bassosimone in #1381
- refactor(dslx): pass Maybe[T] to Func.Apply by @bassosimone in #1382
- dslx: post-Func.Apply(Maybe[T])-introduction cleanups by @bassosimone in #1384
- refactor(dslx): collect observations using runtime by @bassosimone in #1383
- fix(dslx): remove Observations from Maybe by @bassosimone in #1385
- refactor(dslx): type Operation func(context, A) (B, error) by @bassosimone in #1386
- feat(dslx): implement DNSLookupParallel by @bassosimone in #1387
- feat(dslx): introduce MeasureResolvedAddresses by @bassosimone in #1388
🚧 Release engineering (aka keeping the lights on)
- chore: use 2023-12 database by @bassosimone in #1426
- chore: use go1.20.12 by @bassosimone in #1427
- chore: update user agent, reformat code, regenerate statics by @bassosimone in #1429
- chore: update easy-to-update deps by @bassosimone in #1430
- chore: more easy to update deps by @bassosimone in #1431
- chore: upgrade netem and miekg/dns by @bassosimone in #1432
- chore: update to quic-go@v0.40.1 by @bassosimone in #1428
- chore: try to upgrade all possible dependencies by @bassosimone
- cleanup: move dslx inside internal/x by @bassosimone in #1438
- chore: update C deps by @bassosimone in #1434
- cleanup(miniooni): rename kvstore2 to engine by @bassosimone in #1436
🐛 Miscellaneous bug fixes
- fix(oonimkall): make sure SoftwareName is set by @bassosimone in #1425
- fix(oonirun): make sure we can parse integers from JSON by @bassosimone in #1435