2018-02-07 19:02:18 +01:00
|
|
|
package list
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/alecthomas/kingpin"
|
2018-02-21 16:06:30 +01:00
|
|
|
"github.com/apex/log"
|
2018-05-03 14:59:55 +02:00
|
|
|
"github.com/ooni/probe-cli/internal/cli/root"
|
2018-05-03 18:40:52 +02:00
|
|
|
"github.com/ooni/probe-cli/internal/database"
|
|
|
|
"github.com/ooni/probe-cli/internal/output"
|
2018-02-07 19:02:18 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2018-05-03 18:40:52 +02:00
|
|
|
cmd := root.Command("list", "List results")
|
2018-02-07 19:02:18 +01:00
|
|
|
|
2018-06-22 12:12:35 +02:00
|
|
|
resultID := cmd.Arg("id", "the id of the result to list measurements for").Int64()
|
|
|
|
|
2018-02-07 19:02:18 +01:00
|
|
|
cmd.Action(func(_ *kingpin.ParseContext) error {
|
2018-05-03 18:40:52 +02:00
|
|
|
ctx, err := root.Init()
|
|
|
|
if err != nil {
|
|
|
|
log.WithError(err).Error("failed to initialize root context")
|
|
|
|
return err
|
|
|
|
}
|
2018-06-22 12:12:35 +02:00
|
|
|
if *resultID > 0 {
|
|
|
|
measurements, err := database.ListMeasurements(ctx.DB, *resultID)
|
|
|
|
if err != nil {
|
|
|
|
log.WithError(err).Error("failed to list measurements")
|
|
|
|
return err
|
|
|
|
}
|
2018-09-11 15:40:42 +02:00
|
|
|
|
|
|
|
msmtSummary := output.MeasurementSummaryData{
|
|
|
|
TotalCount: 0,
|
|
|
|
AnomalyCount: 0,
|
2018-09-12 13:42:16 +02:00
|
|
|
DataUsageUp: 0.0,
|
|
|
|
DataUsageDown: 0.0,
|
2018-09-11 16:36:09 +02:00
|
|
|
TotalRuntime: 0,
|
2018-09-11 15:40:42 +02:00
|
|
|
}
|
2018-09-10 18:03:32 +02:00
|
|
|
for _, msmt := range measurements {
|
2018-09-11 16:36:09 +02:00
|
|
|
if msmtSummary.TotalRuntime == 0 {
|
|
|
|
msmtSummary.TotalRuntime = msmt.ResultRuntime
|
|
|
|
}
|
2018-09-11 15:40:42 +02:00
|
|
|
// FIXME this logic should be adjusted for test groups that have many
|
|
|
|
// measurements in them
|
|
|
|
if msmtSummary.DataUsageUp == 0 {
|
|
|
|
msmtSummary.DataUsageUp = msmt.DataUsageUp
|
|
|
|
msmtSummary.DataUsageDown = msmt.DataUsageDown
|
|
|
|
}
|
|
|
|
if msmt.IsAnomaly.Bool == true {
|
|
|
|
msmtSummary.AnomalyCount++
|
|
|
|
}
|
|
|
|
msmtSummary.TotalCount++
|
2018-09-10 18:03:32 +02:00
|
|
|
output.MeasurementItem(msmt)
|
2018-06-22 12:12:35 +02:00
|
|
|
}
|
2018-09-11 15:40:42 +02:00
|
|
|
output.MeasurementSummary(msmtSummary)
|
2018-06-22 12:12:35 +02:00
|
|
|
} else {
|
|
|
|
doneResults, incompleteResults, err := database.ListResults(ctx.DB)
|
|
|
|
if err != nil {
|
|
|
|
log.WithError(err).Error("failed to list results")
|
|
|
|
return err
|
|
|
|
}
|
2018-05-03 18:40:52 +02:00
|
|
|
|
2018-06-22 12:12:35 +02:00
|
|
|
if len(incompleteResults) > 0 {
|
|
|
|
output.SectionTitle("Incomplete results")
|
|
|
|
}
|
|
|
|
for idx, result := range incompleteResults {
|
|
|
|
output.ResultItem(output.ResultItemData{
|
2018-09-10 16:56:32 +02:00
|
|
|
ID: result.ResultID,
|
2018-09-10 12:41:28 +02:00
|
|
|
Index: idx,
|
|
|
|
TotalCount: len(incompleteResults),
|
|
|
|
Name: result.TestGroupName,
|
|
|
|
StartTime: result.StartTime,
|
|
|
|
NetworkName: result.Network.NetworkName,
|
|
|
|
Country: result.Network.CountryCode,
|
2018-09-11 18:06:15 +02:00
|
|
|
ASN: result.Network.ASN,
|
2018-09-10 12:41:28 +02:00
|
|
|
MeasurementCount: 0,
|
|
|
|
MeasurementAnomalyCount: 0,
|
|
|
|
TestKeys: "{}", // FIXME this used to be Summary we probably need to use a list now
|
|
|
|
Done: result.IsDone,
|
|
|
|
DataUsageUp: result.DataUsageUp,
|
|
|
|
DataUsageDown: result.DataUsageDown,
|
2018-06-22 12:12:35 +02:00
|
|
|
})
|
|
|
|
}
|
2018-06-22 11:53:10 +02:00
|
|
|
|
2018-06-22 12:12:35 +02:00
|
|
|
resultSummary := output.ResultSummaryData{}
|
2018-09-07 15:39:22 +02:00
|
|
|
netCount := make(map[uint]int)
|
2018-06-22 12:12:35 +02:00
|
|
|
output.SectionTitle("Results")
|
|
|
|
for idx, result := range doneResults {
|
2018-09-10 16:56:32 +02:00
|
|
|
totalCount, anmlyCount, err := database.GetMeasurementCounts(ctx.DB, result.ResultID)
|
2018-09-10 12:41:28 +02:00
|
|
|
if err != nil {
|
|
|
|
log.WithError(err).Error("failed to list measurement counts")
|
|
|
|
}
|
2018-09-10 16:56:32 +02:00
|
|
|
testKeys, err := database.GetResultTestKeys(ctx.DB, result.ResultID)
|
2018-09-10 15:03:52 +02:00
|
|
|
if err != nil {
|
|
|
|
log.WithError(err).Error("failed to get testKeys")
|
|
|
|
}
|
2018-06-22 12:12:35 +02:00
|
|
|
output.ResultItem(output.ResultItemData{
|
2018-09-10 16:56:32 +02:00
|
|
|
ID: result.ResultID,
|
2018-09-10 12:41:28 +02:00
|
|
|
Index: idx,
|
|
|
|
TotalCount: len(doneResults),
|
|
|
|
Name: result.TestGroupName,
|
|
|
|
StartTime: result.StartTime,
|
|
|
|
NetworkName: result.Network.NetworkName,
|
|
|
|
Country: result.Network.CountryCode,
|
2018-09-11 18:06:15 +02:00
|
|
|
ASN: result.Network.ASN,
|
2018-09-10 15:03:52 +02:00
|
|
|
TestKeys: testKeys,
|
2018-09-10 12:41:28 +02:00
|
|
|
MeasurementCount: totalCount,
|
|
|
|
MeasurementAnomalyCount: anmlyCount,
|
2018-09-05 18:40:37 +02:00
|
|
|
Done: result.IsDone,
|
2018-06-22 12:12:35 +02:00
|
|
|
DataUsageUp: result.DataUsageUp,
|
|
|
|
DataUsageDown: result.DataUsageDown,
|
|
|
|
})
|
|
|
|
resultSummary.TotalTests++
|
2018-09-07 15:39:22 +02:00
|
|
|
netCount[result.Network.ASN]++
|
2018-06-22 12:12:35 +02:00
|
|
|
resultSummary.TotalDataUsageUp += result.DataUsageUp
|
|
|
|
resultSummary.TotalDataUsageDown += result.DataUsageDown
|
|
|
|
}
|
|
|
|
resultSummary.TotalNetworks = int64(len(netCount))
|
2018-06-22 11:53:10 +02:00
|
|
|
|
2018-06-22 12:12:35 +02:00
|
|
|
output.ResultSummary(resultSummary)
|
|
|
|
}
|
2018-06-22 11:53:10 +02:00
|
|
|
|
2018-02-07 19:02:18 +01:00
|
|
|
return nil
|
|
|
|
})
|
|
|
|
}
|