Open Source im professionellen Einsatz
Linux-Magazin 04/2015
© kurhan, 123RF.com

© kurhan, 123RF.com

Perl-Skript stöbert in Git-Metadaten

Unter der Haube

Der Projekthoster Github beherbergt nicht nur die Code-Repositories vieler bekannter Open-Source-Projekte, sondern bietet auch ein durchdachtes API an, mit dem sich in ihnen herrlich herumschnüffeln lässt.

1065

Kaum ein Softwareprojekt kommt heute ohne Git aus. Wer einmal die Performancevorteile registriert hat, dem kommt SVN vor wie aus der Ära der Postkutsche. Da Github ein schönes UI drum herum gewickelt hat, kostenlos und zuverlässig die Daten speichert und Pull Requests so spielend von der Hand gehen, schwören viele Entwickler wie ich auf den Git-Hoster aus San Francisco.

Über die Jahre haben sich so in meinem Account 57 öffentlich sichtbare Repositories angesammelt, die meisten enthalten irgendwelche CPAN-Module, aber auch die Textdaten für meinen Blog http://usarundbrief.com lagern dort [2]. Höchste Zeit, mal mit Perl in den zugehörigen Metadaten zu schnüffeln!

Gerade im Zusammenhang mit automatischen Buildsystemen erfolgt der Zugriff auf die Metadaten der Git-Repositories nicht mehr nur von Hand im Browser. Vielmehr saugen automatisch ablaufende Skripte alles Nötige per API aus dem Datenfüllhorn. Zur Ansteuerung mit Perl findet sich auf dem CPAN die Modulsammlung Net::GitHub von Fayland Lam. Mit den erforderlichen Zugriffsrechten ausgestattet kann der API-Nutzer damit nicht nur lesend zugreifen (Abbildung 1), sondern auch aktiv modifizieren, etwa neuen Code einspeisen.

Abbildung 1: Die Autorenseite auf Github listet ausführlich eigene Repositories und Beiträge zu anderen Repositories auf. Das API bietet ganz Ähnliches.

Damit Github weiß, wer die API-Requests absetzt und notfalls korrigierend einschreiten kann, liegt optional jeder Anfrage an das REST-API ein Authentisierungstoken bei. Das erhält der User nicht nur im Browser-UI, sondern wahlweise auch von einem Skript wie beispielsweise in Listing 1. Es fragt das Passwort des Users ab, schickt die Daten per SSL an den Github-Server und bekommt ein Access-Token zurück.

Listing 1

token-get

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Net::GitHub;
04 use Sysadm::Install qw( :all );
05 use YAML qw( DumpFile );
06
07 my $gh_conf = (glob "~")[0] . "/.githubrc";
08
09 my $pw = password_read("Password:");
10 my $gh = Net::GitHub::V3->new(
11    login => 'mschilli', pass => $pw );
12
13 my $oauth = $gh->oauth;
14 my $o = $oauth->create_authorization( {
15 scopes => [],
16 note => 'empty scope test',
17 } );
18
19 umask 0077;
20 DumpFile $gh_conf,
21 { token => $o->{token} };
22
23 print "$gh_conf written\n";

Statt eines Passworts schickt der Client dann in Zukunft dieses Token mit und wird zum Server vorgelassen. Dabei erhält er die Zugriffsrechte, die beim Generieren des Token vorgegeben wurden. Damit Skripte das Token finden, legt Listing 1 es in der Datei »~/.githubrc« im Yaml-Format im Homeverzeichnis ab. Der Aufruf

$ ./token-get
Password: *****
/Users/mschilli/.githubrc written

vollzieht die notwendigen Schritte für den in Zeile 11 hinterlegten User.

Zu beachten ist, dass das Kommentarfeld »note« beim Aufruf der Methode »create_authorization()« für jedes neu angeforderte Token einen anderen Inhalt haben muss, sonst verweigert Github die Herausgabe des Token und gibt als Ursache eine falsche User-Passwort-Kombination an. Der wahre Grund ist aber, dass Github die Tokens unter diesem Schlüssel auf der Account-Seite des Users auflistet, wo dieser sie modifizieren oder widerrufen kann (Abbildung 2).

Abbildung 2: Die Github-Seite listet alle bisher generierten Access-Tokens auf.

Außerdem gibt der Parameter »scope« an, welche Rechte der Account-Besitzer den Clients in Zukunft einräumt. Bleibt er leer – wie in Listing 1 – gewährt der Server nach [4] nur lesenden Zugriff auf öffentlich verfügbare Daten. Einer oder mehrere Einträge wie »user« oder »repo« im Scope erlauben dem Client hingegen später Lese- und Schreibzugriffe auf Userdaten (zum Beispiel auf dessen E-Mail-Adresse) oder Code-Commits.

Mehr mit Ausweis

Nach den Nutzungsbedingungen [3] räumt Github den Clients, die sich authentifizieren, bis zu 5000 Anfragen pro Stunde ein, während anonyme Anfragen auf 60 pro Stunde und IP begrenzt sind. Das Search-API hingegen, das nach Suchmustern in Repositorynamen oder eingechecktem Code sucht, gibt sich etwas geiziger, es erlaubt 20 Anfragen pro Minute mit Token und ohne nur fünf. Dass das API auch ohne Einloggen funktioniert, zeigt Abbildung 3 mit einer Abfrage der Metadaten des Github-Repository »mschilli/log4perl« .

Abbildung 3: Auch ohne Auth-Token gibt das Github-API Informationen zu Repos oder Usern preis.

Wie viele Anfragen noch durchgehen, bis der Server den Hahn zudreht, steht jeweils im HTTP-Header der Antwort. Abbildung 4 zeigt ein Beispiel von der Kommandozeile ohne Token, bei dem während der angefangenen Stunde schon sieben Abfragen abgeschickt wurden und demnach noch 53 übrig sind.

Abbildung 4: Von 60 erlaubten Anfragen pro Stunde hat der Client noch 53 übrig, bevor der Server den Zähler zum angegebenen Zeitpunkt zurücksetzt.

Das Skript in Listing 2 fragt bei Github die Account-Metadaten des auf der Kommandozeile angegebenen Users ab. Der User weist sich mit dem Access-Token aus, das das CPAN-Modul Yaml aus der Yaml-Datei »~/.githubrc« extrahiert hat. Neben einer Riesenlatte von anderen Feldern steht im zurückkommenden Json-Wust auch die Anzahl der im Account angelegten öffentlich sichtbaren Repositories, Listing 2 gibt sie in Zeile 17 einfach aus:

Listing 2

repo-user

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Net::GitHub;
04 use YAML qw( LoadFile );
05
06 my( $user ) = @ARGV;
07 die "usage: $0 user" if !defined $user;
08
09 my $gh_conf = (glob "~")[0] . "/.githubrc";
10
11 my $gh = Net::GitHub->new( access_token =>
12 LoadFile( $gh_conf )->{ token }
13 );
14
15 my %data = $gh->user->show( $user );
16
17 print "$data{ name } owns ",
18 "$data{ public_repos } public repos\n";
$ ./repo-user mschilli
Mike Schilli owns 57 public repos
$ ./repo-user torvalds
Linus Torvalds owns 2 public repos

Das Skript »repo-user« offenbart ganz nebenbei, dass Linus Torvalds auf Github erstaunlicherweise nur zwei Repositories angelegt hat!

Torvalds : Schilli wie 2 : 57

Die Zeilen 9 und 12 in Listing 2 schnappen sich das zuvor von Listing 1 abgelegte Access-Token und die Methodenkette »->user ->show()« greift hier auf die Accountdaten des Users zu.

Um beispielsweise festzustellen, welche Repositories ein Autor auf Github bereits angelegt hat, dient das Listing 3, das aus den zurückgelieferten Metadaten jeweils nur den Repository-Namen extrahiert und ausgibt.

Listing 3

repos

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Net::GitHub;
04 use YAML qw( LoadFile );
05
06 my $gh_conf = (glob "~")[0] . "/.githubrc";
07
08 my $gh = Net::GitHub->new( access_token =>
09 LoadFile( $gh_conf )->{ token }
10 );
11
12 my @repos = $gh->repos->list( );
13
14 for my $repo ( @repos ) {
15     print $repo->{ name }, "\n";
16 }

Alternativ nimmt die Methode »list_user()« einen Usernamen entgegen (Abbildung 5), und wer »torvalds« eingibt, sieht, dass die beiden Repositories des Linux-Vaters »linux« und »subsurface« heißen.

Abbildung 5: Listing 3 spuckt alle Github-Repositories des angegebenen Users aus.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Ein neuer Service auf Travis-ci.org listet fein säuberlich Github-Projekte eines Entwicklers auf, schickt den Code bei jedem Push durch deren Testsuites und gibt Rückmeldung, falls der Build bricht. In den zurückgelieferten Testergebnissen machen neugierige Perl-Skripte Zusatzinformationen sichtbar.

  • Perl-Snapshot

    Github mit seiner einfach zu bedienende Weboberfläche lässt sich über seine Code-Archiv-Funktion hinaus für ganz und gar artfremde Dinge benutzen. Perlmeister Schilli zum Beispiel pflanzt mit Github ein Contentmanagement-System für einfache Webseiten in die Landschaft.

  • Überall Projekte

    Wie erhält der neu gekaufte Laptop schnellstmöglich Kopien aller aktiv genutzten Git-Repositories? Ein Meta-Repository führt eine Projektliste und Perl-Skripte automatisieren alle Aufspür- und Klonvorgänge.

  • Umzugshelfer

    Der Webdienst Github erleichtert es Programmierern, einen Beitrag zu Open-Source-Projekten zu leisten, denn er vereinfacht und beschleunigt die Kommunikation zwischen Projekt-Maintainern und willigen Mitwirkenden radikal. Perl-Modulen ebnet ein Skript den Weg von CVS zu Git.

  • Stets zu Diensten

    Der Complete-Mechanismus der Shell vervollständigt angefangene Eingaben, sobald der User die Tabulator- taste drückt. Ein Perl-Skript erweitert die Funktion maßgeschneidert.

comments powered by Disqus

Ausgabe 08/2016

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.