☰

GitHub

verify-url

Neulich habe ich über die automatisierte Linkpflege geschrieben. Da der Check nun doch mehr als nur ein cURL-Request mit Auswertung des Statuscodes geworden ist, habe ich ein kleines Composer-Päckchen draus geschnürt.

Kein Symfony-Bundle, einfach nur ein paar Klassen:

use Kniebes\VerifyUrl\VerifyUrl;

$verifyUrl = new VerifyUrl();
$result = $verifyUrl->verify('https://example.com/artikel');

if ($result->isValid() && $result->getReplacement() === null) {
    // URL ist in Ordnung
}

if ($result->getReplacement() !== null) {
    // Original ist kaputt, Snapshot aus der Wayback Machine verwenden
    $alternateUrl = $result->getReplacement();
}

foreach ($result->getErrors() as $error) {
    // Gründe, warum die Original-URL verworfen wurde
}

Bei als defekt erkannten Links wird die Wayback Machine nach einer Alternative gefragt. Das Paket hält zwar zwei Sekunden Abstand zwischen den Anfragen, aber wenn man dem Service zu sehr auf den Zwickel geht, kommt trotzdem schnell ein 429. Das muss man außerhalb des Pakets abfangen.

Aktuell gibt es noch ein Problem mit Cloudflare. Wenn der Service vorgeschaltet ist und die Bot-Abfrage von Cloudflare ausgeliefert wird, werden die Seiten als kaputt erkannt und es wird eine Wayback-Machine-Alternative gesucht. Ich denke, da wird noch eine Analyse des Response-Headers notwendig sein, um den Link nicht generell als defekt, sondern als nicht überprüfbar zu markieren.

Ein Rechner; zwei GitHub-Accounts

Da es vorkommt, dass ich meinen „richtigen“ Mac auch mal für berufliche Zwecke nutze, wenn mich das kleine Notebook anstinkt, benötige ich auch verschiedene SSH Schlüssel für verschiedene GitHub Accounts auf dem gleichen Rechner.

Dazu habe ich zwei Schlüssel. Nenne wir sie einfach id_home und id_work und gehen davon aus, dass die beiden öffentlichen Schlüssel bei dem jeweils passenden Account auf GitHub hinterlegt sind.

In der ~/.git/config lege ich zwei Host Einträge an, die zu den Schlüsseln passen:

Host github.com_home
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_home

Host github.com_work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_work

Mit dem Befehl ssh -T git@github.com_home bzw. ssh -T git@github.com_work kann der Login geprüft werden. Die Ausgabe sollte im Idealfall wie folgt aussehen:

Hi {username}! 
You've successfully authenticated, but GitHub does not provide shell access.

In der .git/config der Projekte benutze ich dann den passenden Host in der Repository URL damit der richtige Schlüssel für die Authentifizierung benutzt wird.

Bei einem „Home“-Projekt sieht die URL dann so aus:

[remote "origin"]
    url = git@github.com_home:{usename}/{project}.git

Wenn ein Repo frisch eingerichtet wird, kann an das auch direkt beim Verbinden machen:

git remote set-url origin git@github.com_home:{usename}/{project}.git

Um es mir einfacher zu machen, habe ich schlußendlich für die „Home“-Projekte den Host einfach bei github.com belassen und nur den Host für Work entsprechend benannt, da ich auf dem Rechner wesentlich mehr „Home“-Projekte als „Work“-Projekte habe.

Ich weiss nicht, ob es eine einfachere Möglichkeit gibt, den Zugriff mit bestimmten Accounts auf Repos zu steuern. Aber diese Lösung funktioniert ganz gut.