ooni-probe-cli/internal/cmd/e2epostprocess/main.go

85 lines
2.0 KiB
Go
Raw Normal View History

package main
import (
"bytes"
"encoding/json"
"flag"
"log"
"os"
"path/filepath"
"strings"
"golang.org/x/sys/execabs"
)
func fatalOnError(err error) {
if err != nil {
log.Fatal(err)
}
}
// Measurement contains a OONI measurement.
type Measurement struct {
ReportID string `json:"report_id"`
Input *string `json:"input"`
SoftwareName string `json:"software_name"`
SoftwareVersion string `json:"software_version"`
}
func main() {
backend := flag.String("backend", "https://api.ooni.io/", "Backend to use")
expected := flag.Int("expected", 0, "Expected number of measurement files")
flag.Parse()
if *expected <= 0 {
log.Fatal("You MUST specify `-expected N`")
}
// based off https://flaviocopes.com/go-list-files/
var files []string
outputdir := "./E2E/"
err := filepath.Walk(outputdir, func(path string, info os.FileInfo, err error) error {
if strings.HasSuffix(path, ".jsonl") {
files = append(files, path)
}
return nil
})
fatalOnError(err)
if len(files) <= 0 {
log.Fatal("no files to process?!")
}
var found int
for _, file := range files {
data, err := os.ReadFile(file)
fatalOnError(err)
measurements := bytes.Split(data, []byte("\n"))
for _, measurement := range measurements {
if len(measurement) <= 0 {
continue
}
var entry Measurement
err = json.Unmarshal(measurement, &entry)
fatalOnError(err)
log.Printf("processing: %+v", entry)
options := []string{
"run",
"./internal/cmd/apitool",
"-backend", *backend,
"-mode", "meta",
"-report-id", entry.ReportID,
}
found++
if entry.Input != nil {
options = append(options, "-input")
options = append(options, *entry.Input)
}
log.Printf("run: go %s", strings.Join(options, " "))
cmd := execabs.Command("go", options...)
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
err = cmd.Run()
fatalOnError(err)
}
}
if found != *expected {
log.Fatalf("expected %d measurements, found %d measurements", *expected, found)
}
}