feat(beacon): sig det uopfordret, og lad være med at fejle i tavshed
Beaconet er slået til som udgangspunkt. Det kan kun forsvares, hvis det bliver sagt af sig selv — og det blev det ikke. Det stod rigtigt og fyldestgørende under Indstillinger → Data, som er en side, der bliver åbnet af dem, der i forvejen har en mistanke om, at der er noget at læse. For alle andre var "du kan slå den fra" et tilbud til nogen, der ikke vidste, der var noget at slå fra. Nu møder en administrator beskeden første gang: hvad der bliver sendt, med de rigtige værdier i — det rigtige id, den rigtige version, den rigtige adresse — og to knapper. Værdierne står der frem for ordet "anonymt", fordi et løfte om telemetri er præcis så meget værd som læserens mulighed for at efterprøve det. `keep` er en peger og ikke en bool. En tom krop måtte ikke kunne betyde "slå det fra": et fravalg, ingen har truffet, er lige så meget et brudt løfte som et tilvalg, ingen har truffet. Og tre ting mere, som Yggdrasil har lært på den hårde måde: Et beacon, der ikke kan nå sin collector, fejlede i fuldstændig tavshed. Det prøvede igen i morgen, siden sagde "sidst sendt" med en dato, der bare blev ældre, og ingen opdagede det. Grunden bliver nu skrevet ned og vist. En installation, der opdaterer sig selv om natten, meldte gårsdagens version i op til et døgn, fordi døgnet blev talt fra sidste vellykkede melding. En version, der er skiftet, sender nu med det samme. Og det offentliggjorte tal har fået et gulv. Et tal, der falder, kan ikke offentliggøres som en kendsgerning — en dårlig udrulning, en DNS-ændring, der stille stopper meldingerne, og rækker, der er væk, ser alle sammen ud som "færre bruger det nu". Adressen bliver stående: Verdande melder til verdande.yggdrasilpanel.com, ikke til panelets egen collector. De to tæller hver sin slags installation, og en fælles tabel har intet felt til at holde dem ude fra hinanden. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
445d9de57a
commit
0cf5c8c281
+83
-1
@@ -1564,7 +1564,15 @@ paths:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
installs: { type: integer }
|
||||
installs:
|
||||
type: [integer, "null"]
|
||||
description: |
|
||||
Null below the collector's floor (`publish_min`, 25 by
|
||||
default). A number that *falls* cannot be published as a
|
||||
fact — a bad release, a DNS change that quietly stops the
|
||||
pings, or lost rows all look like "fewer people use this
|
||||
now" — and a small number mostly says how little it takes
|
||||
to move it.
|
||||
window_days: { type: integer }
|
||||
"404":
|
||||
description: Not a collector, or not published.
|
||||
@@ -1590,7 +1598,19 @@ paths:
|
||||
version: { type: string }
|
||||
is_collector: { type: boolean }
|
||||
publish_count: { type: boolean }
|
||||
publish_min:
|
||||
type: integer
|
||||
description: The floor under the published count.
|
||||
last_ping_at: { type: string, format: date-time }
|
||||
last_error:
|
||||
type: string
|
||||
description: |
|
||||
Why the last attempt did not arrive; absent when the last
|
||||
one did. Shown rather than only logged: a beacon that
|
||||
cannot reach its collector otherwise fails in complete
|
||||
silence, and the only trace is a "last sent" date that
|
||||
quietly gets older.
|
||||
last_error_at: { type: string, format: date-time }
|
||||
put:
|
||||
tags: [auth]
|
||||
summary: Turn the beacon off, or point it somewhere else. Administrators only.
|
||||
@@ -1610,12 +1630,74 @@ paths:
|
||||
make the server reach inside its own network.
|
||||
is_collector: { type: boolean }
|
||||
publish_count: { type: boolean }
|
||||
publish_min: { type: integer, minimum: 0 }
|
||||
responses:
|
||||
"200":
|
||||
description: The configuration as it now stands.
|
||||
"422":
|
||||
description: The collector address is not an http or https URL.
|
||||
|
||||
/api/v1/beacon/notice:
|
||||
get:
|
||||
tags: [auth]
|
||||
summary: Whether the disclosure is still owed, and what it says. Administrators only.
|
||||
description: |
|
||||
The beacon is on by default, and that is only defensible if it is said
|
||||
unprompted. A settings page where it is stated fully is not the same as
|
||||
saying it: that page is opened by people who already suspect there is
|
||||
something to read.
|
||||
|
||||
The three values are in the response — the real id, the real version, the
|
||||
real collector address — so the notice can show what is sent rather than
|
||||
say "anonymous data" and ask to be believed.
|
||||
responses:
|
||||
"200":
|
||||
description: OK
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
pending:
|
||||
type: boolean
|
||||
description: False once anybody has answered, panel-wide.
|
||||
enabled: { type: boolean }
|
||||
instance_id: { type: string }
|
||||
version: { type: string }
|
||||
collector_url: { type: string }
|
||||
post:
|
||||
tags: [auth]
|
||||
summary: Answer the notice. Administrators only.
|
||||
description: |
|
||||
One call for both answers — "keep it on" and "turn it off" are the same
|
||||
act, somebody deciding, and two endpoints would mean one of them could
|
||||
forget to record that a decision was made.
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
required: [keep]
|
||||
properties:
|
||||
keep:
|
||||
type: boolean
|
||||
description: |
|
||||
Required, and rejected when absent. An empty body must not be
|
||||
able to mean "turn it off": an opt-out nobody chose is as much
|
||||
a broken promise as an opt-in nobody chose.
|
||||
responses:
|
||||
"200":
|
||||
description: Recorded.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
enabled: { type: boolean }
|
||||
"422":
|
||||
description: No answer was given.
|
||||
|
||||
/api/v1/panel/restart:
|
||||
post:
|
||||
tags: [auth]
|
||||
|
||||
Reference in New Issue
Block a user