first commit
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,177 @@
|
||||
# Windows-Rollout
|
||||
|
||||
Zwei Skripte:
|
||||
|
||||
| Datei | Laeuft auf | Zweck |
|
||||
|-----------------------------|------------|-----------------------------------------------------------|
|
||||
| `deploy-windows.sh` | macOS/Linux| Version hochzaehlen, `.xpi` bauen, per SSH ausrollen |
|
||||
| `Install-SwyxTabBridge.ps1` | Windows | Die eigentliche Installation; auch allein verwendbar |
|
||||
|
||||
## Schnellstart
|
||||
|
||||
```bash
|
||||
./deploy/deploy-windows.sh
|
||||
```
|
||||
|
||||
Ohne Parameter: Version hochzaehlen, bei AMO signieren, auf den Testrechner
|
||||
uebertragen, Policy schreiben und den laufenden Firefox beenden, damit die
|
||||
Installation sofort greift. Die Voreinstellungen stehen als Konstanten oben im
|
||||
Skript:
|
||||
|
||||
| Konstante | Wert |
|
||||
|--------------------------|-----------------------------------------------|
|
||||
| `DEFAULT_HOST` | `swyx-dev` (Alias aus `~/.ssh/config`) |
|
||||
| `DEFAULT_FIREFOX_DIR` | `C:\Users\dev\AppData\Local\Mozilla Firefox` |
|
||||
| `DEFAULT_SIGN` | `true` |
|
||||
| `DEFAULT_ALLOW_UNSIGNED` | `false` |
|
||||
| `DEFAULT_STOP_FIREFOX` | `true` |
|
||||
|
||||
Ziel ist die **Release**-Installation, und die nimmt ausschliesslich signierte
|
||||
Add-ons — deshalb signiert jeder Lauf. Das kostet pro Aufruf eine Versionsnummer
|
||||
bei AMO; die wird ohnehin bei jedem Lauf hochgezaehlt.
|
||||
|
||||
Der Firefox-Pfad steht fest, weil auf dem Rechner zusaetzlich die Developer
|
||||
Edition liegt und die automatische Suche bei zwei Funden abbricht. Fuer einen
|
||||
anderen Rechner:
|
||||
|
||||
```bash
|
||||
./deploy/deploy-windows.sh --host admin@ws-042 --firefox-dir auto
|
||||
```
|
||||
|
||||
Ein bereits signiertes Paket laesst sich ohne neuen AMO-Durchlauf erneut
|
||||
ausrollen:
|
||||
|
||||
```bash
|
||||
./deploy/deploy-windows.sh --xpi build/56806207b7434031914b-1.0.16.xpi --no-bump
|
||||
```
|
||||
|
||||
Jeder Aufruf zaehlt die Version in `manifest.json` hoch (Default: Patch-Stelle).
|
||||
Das ist keine Kosmetik: Firefox installiert ein Paket mit gleicher oder
|
||||
kleinerer Version nicht erneut, und AMO nimmt eine Version nur einmal zum
|
||||
Signieren an. Steuern laesst es sich mit `--bump major|minor|patch|build|none`,
|
||||
`--set-version X.Y.Z` oder `--no-bump`.
|
||||
|
||||
## Die Signatur ist der Knackpunkt
|
||||
|
||||
Firefox **Release und Beta** installieren ausschliesslich signierte Add-ons —
|
||||
`xpinstall.signatures.required` wird dort ignoriert. Damit bleiben zwei Wege:
|
||||
|
||||
**Signieren (empfohlen, funktioniert ueberall).** Kanal `unlisted` =
|
||||
Selbst-Hosting ohne Store-Eintrag:
|
||||
|
||||
```bash
|
||||
./deploy/deploy-windows.sh --firefox-dir auto --require-signed --sign
|
||||
```
|
||||
|
||||
Die Zugangsdaten liegen in `deploy/.amo-credentials` (Konto *AppCreation GmbH*)
|
||||
und werden vom Skript selbst eingelesen. Die Datei traegt `chmod 600`, steht in
|
||||
`.gitignore` und ist nicht Teil des Pakets — der Schluessel gilt fuer das
|
||||
**gesamte AMO-Konto**, nicht nur fuer dieses Add-on. Neu erzeugen laesst er sich
|
||||
unter addons.mozilla.org → *Tools* → *Manage API Keys* → *Revoke and regenerate
|
||||
credentials*.
|
||||
|
||||
Bereits gesetzte Umgebungsvariablen haben Vorrang, ein einzelner Lauf laesst sich
|
||||
also uebersteuern:
|
||||
|
||||
```bash
|
||||
WEB_EXT_API_KEY="user:…" WEB_EXT_API_SECRET="…" ./deploy/deploy-windows.sh --sign
|
||||
```
|
||||
|
||||
Die `gecko.id` im Manifest muss ueber alle Versionen stabil bleiben, und AMO nimmt
|
||||
jede Versionsnummer nur einmal an — dafuer zaehlt das Skript bei jedem Aufruf hoch.
|
||||
|
||||
**Unsigniert (nur ESR, Developer Edition, Nightly).** Mit `--no-sign
|
||||
--allow-unsigned` hinterlegt das Skript eine autoconfig-Datei, die
|
||||
`xpinstall.signatures.required` auf `false` sperrt. Auf Firefox Release oder Beta
|
||||
warnt es, weil die Einstellung dort wirkungslos bleibt. Fuer den normalen Betrieb
|
||||
wird das nicht gebraucht.
|
||||
|
||||
Das Manifest fuehrt ausserdem `data_collection_permissions` mit
|
||||
`required: ["browsingActivity"]` — seit dem 3. November 2025 Pflicht fuer neue
|
||||
Erweiterungen auf AMO. Begruendung siehe Haupt-README.
|
||||
|
||||
## Policy oder Profil
|
||||
|
||||
`--mode policy` (Default) schreibt `<FirefoxDir>\distribution\policies.json` mit
|
||||
`installation_mode: force_installed`. Das Add-on wird beim naechsten Start ohne
|
||||
Rueckfrage fuer alle Profile installiert und laesst sich nicht deaktivieren.
|
||||
Vorhandene Policies bleiben erhalten (die Datei wird zusammengefuehrt und vorher
|
||||
gesichert). Das `.xpi` landet in `%ProgramData%\SwyxTabBridge\`, bei einer
|
||||
Benutzerinstallation in `%LOCALAPPDATA%\SwyxTabBridge\`.
|
||||
|
||||
`--mode profile` legt das `.xpi` direkt in `<Profil>\extensions\` ab. Das wirkt
|
||||
nur fuer die Profile eines Benutzers, und Firefox fragt beim naechsten Start
|
||||
einmal nach Bestaetigung.
|
||||
|
||||
Massgeblich fuer die Rechte ist nicht "Admin ja/nein", sondern das Schreibrecht
|
||||
im Firefox-Verzeichnis: eine Benutzerinstallation unter `%LOCALAPPDATA%\Mozilla
|
||||
Firefox` laesst sich ohne jedes Sonderrecht mit einer Policy versehen, eine
|
||||
Installation unter `C:\Program Files` braucht Administratorrechte.
|
||||
|
||||
## Laufender Firefox
|
||||
|
||||
Voreingestellt beendet das Skript den laufenden Firefox, damit die Installation
|
||||
sofort greift statt erst beim naechsten Neustart; `--keep-firefox` laesst ihn in
|
||||
Ruhe. Beendet wird dabei nur, was aus dem Zielverzeichnis gestartet wurde —
|
||||
liegen wie auf dem Testrechner zwei Installationen nebeneinander, laufen beide
|
||||
als `firefox.exe`, und die nicht adressierte bleibt offen. Firefox stellt die
|
||||
Sitzung beim naechsten Start wieder her.
|
||||
|
||||
## SSH ohne Passwort
|
||||
|
||||
Der Testrechner ist bereits auf Schluessel-Anmeldung eingerichtet:
|
||||
|
||||
- Schluessel: `~/.ssh/id_ed25519_swyx_deploy` (ohne Passphrase, damit das
|
||||
Deployment ohne Rueckfrage durchlaeuft)
|
||||
- `~/.ssh/config` enthaelt den Alias `swyx-dev` mit Benutzer und Schluessel
|
||||
- Auf dem Windows-Rechner liegt der oeffentliche Schluessel in
|
||||
`C:\ProgramData\ssh\administrators_authorized_keys`
|
||||
|
||||
Der letzte Punkt ist die uebliche Stolperfalle: fuer Mitglieder der
|
||||
Administratorengruppe liest der Windows-SSH-Dienst **nicht**
|
||||
`~/.ssh/authorized_keys`, sondern jene zentrale Datei — und nur dann, wenn deren
|
||||
ACL auf SYSTEM und Administratoren beschraenkt ist:
|
||||
|
||||
```powershell
|
||||
icacls C:\ProgramData\ssh\administrators_authorized_keys `
|
||||
/inheritance:r /grant "*S-1-5-18:F" /grant "*S-1-5-32-544:F"
|
||||
```
|
||||
|
||||
Die SIDs statt der Namen, damit es auf deutschem Windows genauso greift.
|
||||
|
||||
Fuer einen Rechner ohne Schluessel oder mit Jumphost laesst sich ein eigener
|
||||
Aufrufer davorhaengen:
|
||||
|
||||
```bash
|
||||
SSH_CMD="sshpass -e ssh" SCP_CMD="sshpass -e scp" SSHPASS='…' \
|
||||
./deploy/deploy-windows.sh --host dev@192.168.180.135
|
||||
```
|
||||
|
||||
Die Kommandos gehen als UTF-16LE-Base64 (`powershell -EncodedCommand`) ueber die
|
||||
Leitung. Dadurch ist egal, ob auf dem Ziel `cmd.exe` oder PowerShell die
|
||||
Standard-Shell ist, und es gibt kein Quoting-Problem mit Leerzeichen oder
|
||||
Backslashes.
|
||||
|
||||
## Weitere Optionen
|
||||
|
||||
```
|
||||
--no-sign nicht signieren (nur mit --allow-unsigned sinnvoll)
|
||||
--keep-firefox laufenden Firefox nicht beenden
|
||||
--firefox-dir Installationsverzeichnis vorgeben (bei mehreren Installationen noetig)
|
||||
--target-user Windows-Benutzer fuer --mode profile
|
||||
--uninstall Policy, hinterlegtes Paket und Profil-Kopien entfernen
|
||||
--build-only nur bauen
|
||||
--dry-run nur anzeigen, was passieren wuerde
|
||||
```
|
||||
|
||||
Exitcodes von `Install-SwyxTabBridge.ps1`: `0` Erfolg, `1` Fehler, `2` Erfolg,
|
||||
aber Firefox muss noch neu gestartet werden.
|
||||
|
||||
## Danach pruefen
|
||||
|
||||
- `about:addons` — ist das Add-on da und aktiv?
|
||||
- `about:policies#active` — hat Firefox die Policy gelesen?
|
||||
- Symbolleisten-Icon: kein Badge = verbunden, `…` = Verbindungsaufbau, `!` = getrennt.
|
||||
- Die Server-Adresse (Default `ws://127.0.0.1:17655`) liegt in
|
||||
`browser.storage.local` und laesst sich von aussen nicht vorbelegen — bei
|
||||
abweichender Adresse einmal ueber *Einstellungen* im Popup setzen.
|
||||
Reference in New Issue
Block a user