Drush, was für Drupal Shell steht, ermöglicht es bestimmte Drupal-Aktionen über die Kommandozeile auszuführen.

Welche Vorteile hat der Einsatz der Kommandozeile mit Drupal:

  • Zeitgesteuerte Aufgaben über Crontab ausführen (z.B. für SimpleTests)
  • Zusammengefasste Aufgaben über ein Skript ausführen
  • Schnellere, unkompliziertere Ausführung wichtiger Aktionen, die für die Drupal Entwicklung und auch beim Deployment das Leben erleichtern
  • API für eigene Shell Skripte (z.B. Cron Jobs, Datenimport, etc.)

Die Vorteile von Drush

1. Voraussetzungen

  • PHP CLI muss auf dem Server vorhanden sein, auf dem sich die Drupal Installation befindet.
  • Shell Zugang zum Server muss bestehen. Der Zugriff kann über SSH, Telnet oder einer seriellen Konsole erfolgen. Falls es sich um eine lokale Installation unter Linux handelt, reicht eine einfache Bash Shell. Anmerkung: Hat man ein Webhosting Paket ohne Shellzugriff, ist Drush nicht einsetzbar!
  • Linux Basiswissen, vor allem für den Umgang mit der Shell

2. Installation

Drush installiert man wie jedes andere Modul auch, indem man das Modul in das entsprechende Verzeichnis entpackt und dieses dann über die Modulverwaltung aktiviert. Es werden mit Drush noch einige Submodule geliefert, die nach Bedarf aktiviert werden können. Um die Mächtigkeit von Drush kennen zu lernen, empfiehlt es sich alle Module auf einer Entwicklungsumgebung zu aktivieren.

Hier eine Liste der aktuellen Module, die Drush Funktionalität anbieten:

  • drush_pm (wird mit Drush ausgeliefert) Ermöglicht das installieren und aktualisieren von Modulen. Der Datentransfer kann über curl, wget, cvs oder svn durchgeführt werden.
  • drush_simpletest (wird mit Drush ausgeliefert) Ausführen von SimpleTests über die Kommandozeile
  • drush_sql (wird mit Drush ausgeliefert) Ausführen von SQL Queries, zur Erstellung von Dumps oder Informationen zur Datenbank
  • drush_tools (wird mit Drush ausgeliefert) Leeren des Drupal Cache und Ausführung des Drupal Cron, Zugriff auf Watchdog
  • drush_mm Aktivieren, deaktivieren und deinstallieren von Modulen

Nun muss man noch die Datei drush.php als ausführbar markieren, das kann man mit folgendem Befehl erreichen:

chmod +x drush.php

(Anmerkung: vorher muss in das drush Modul Verzeichnis gewechselt werden)

Um Drush einfach einsetzen zu können, empfiehlt es sich noch Aliases anzulegen. Dadurch hat man drei Vorteile:

  1. man kann aus jedem Verzeichnis drush aufrufen, und muss nicht erst in das Drupal Hauptverzeichnis
  2. man erspart sich die Übergabe zusätzlicher Parameter, die bei einer Multisite Umgebung obligatorisch sind.
  3. der Aufruf von Drush wird an einer einzigen Stelle definiert. Ändern sich die System/Projektbedingungen, genügt es diese Stelle anzupassen.

Im folgenden Beispiel wird vorausgesetzt, dass das Drupal Hauptverzeichnis sich unter /www/drupal6/htdocs befindet und dies über die URL http://drupal6.local angesprochen werden kann. Um dafür ein Alias anzulegen, welches automatisch in jeder Shell verfügbar sein wird, fügt man folgende Zeile in die ~/.bashrc ein:

alias drush="/www/drupal6/htdocs/sites/all/modules/drush/drush.php -r /www/drupal6/htdocs -l http://drupal6.local"

Beim nächsten Login steht das Alias zur Verfügung. Um die Änderungen sofort ohne ein Neuanmelden zu aktivieren, führt man folgenden Befehl aus:

source ~/.bashrc

Nun sollte das Alias drush6 über die Shell ausführbar sein. Der Name des Alias kann natürlich frei gewählt werde, so kann man für die einzelnen Projekte innerhalb einer Multisite Umgebung unterschiedliche Aliases verwenden. Am besten jetzt ausprobieren. Wenn man nicht die Ausgabe von drush (siehe unten) angezeigt bekommt, ist irgendetwas schief gelaufen.

Will man den Komfort der unkomplizierten Anwendung von Drush auch in Cronjobs nutzten, kann man leider nicht mit Bash Aliases arbeiten (falls das jemand geschafft hat, wäre ich für einen Hinweis dankbar!). Natürlich gibt es aber eine Lösung dafür, auch hier nicht alle Parameter übergeben zu müssen, nämlich mit einem Bash Wrapper Skript. Anstelle des oben definierten Bash Alias legt man eine neu Datei mit dem Namen drush an (auch hier kann der Name frei gewählt werden) und füllt die Datei mit folgenden Inhalt:

#/bin/sh
/www/drupal6/htdocs/sites/all/modules/drush/drush.php -r /www/drupal6/htdocs -l http://drupal6.local "$@"

Wichtig ist, dass diese Datei in einem Verzeichnis abgelegt wird, welches im Pfad für ausführbare Dateien definiert ist. Es muss auch darauf geachtet werden, dass die Datei selbst als ausführbar markiert wird.

Alternativ (oder auch in Kombination) zum Einsatz von Aliases oder eines Bash Wrapper Skript kann man auch die Konfiguration des Aufrufes durch die Datei drushrc.php festlegen. Die Konfigurationsdatei wird dann mit dem Parameter -c meindrushrc.php Drush übergeben. Man könnte sich beispielsweise bei einer Multisite Installation für jedes Projekt eine Konfigurationsdatei anlegen. Ein Beispiel für eine mögliche Konfigurationsdatei wird mit dem Drush Modul ausgeliefert. Zu finden ist diese in der Datei “example.drushrc.php”.

3. Anwendung

Wenn man Drush ohne Parameter aufruft, liefert Drush eine Informationsseite zurück, die alle verfügbaren Kommandos auflistet:

Usage: drush.php [options] <command> <command> ...

Options:
  -r <path>, --root=<path>	Drupal root directory to use (default: current directory)
  -l <uri> , --uri=<uri>  	URI of the drupal site to use (only needed in multisite environments)
  -v, --verbose           	Display all available output
  -y, --yes               	Assume 'yes' as answer to all prompts
  -s, --simulate          	Simulate all relevant actions (don't actually change the system)
  -c, --config            	Specify a config file to use. See example.drushrc.php

Commands:
  help              	View help. Run "drush help [command]" to view command-specific help.
  pm install        	Install one or more modules
  pm refresh        	Refresh update status information
  pm update         	Update your modules
  pm info           	Release information for a module
  test run          	Run one or more Simpletest tests.
  test list         	List the available Simpletest test classes.
  sql url           	Print database connection details.
  sql version server	Print database server version number.
  sql version client	Print database client library version number.
  sql dump          	Exports the Drupal DB as SQL using mysqldump or pg_dump.
  sql query         	Execute a query against the site database.
  sql load          	Copy source database to target database.
  cache clear       	Clear all caches
  cron              	Run cron
  watchdog show     	Show the most recent watchdog log messages
  watchdog delete   	Delete all messages of a certain type
  sync              	Rsync the Drupal tree to/from another server using ssh
  eval              	Evaluate a command
  mm list           	Lists the available modules
  mm enable         	Enables (and if necessary installs) the given modules and depend
  mm disable        	Disable the given modules and reverse dependants
  mm uninstall      	Uninstalls the given modules and reverse dependants
  mm dot            	Generates a dot file of all modules

4. Anwendungsbereiche von Drush

Ok, und jetzt einige Beispiele aus der Praxis, was man mit Drush alles so anstellen kann:

a) Ein PHP Skript einbinden

Ein Use-Case wäre z.B. eine Datenmigration. Ohne Drush muss man sich selbst um das Laden des Drupal Bootstrap kümmern. Mit Drush reicht das anlegen einer neuen Datei. Man kann sofort auf alle Drupal Funktionen zurückgreifen. Beispiel für die Ausgabe der 10 neusten Benutzer: Man legt eine Datei mit dem Namen /tmp/latest_user.php mit folgenden Inhalt an:

<?php
$result = db_query_range('SELECT uid, name FROM {users}
                          ORDER BY created DESC', 0, 10);
while ($row = db_fetch_object($result)) {
  echo $row->name .' (uid='. $row->uid .")\n";
}

Aufgerufen wird die Datei dann mit folgendem Befehl:

drush6  eval "require_once('/tmp/test.php');"

Interpretation der Vorgehensweise: Als erstes ist zu beachten, dass hier für die Include Datei ein absoluter Pfad angegeben wurde. Hätte ich keine Pfadangaben verwendet, würde Drupal davon ausgehen, dass die Datei sich im Drupal Hauptverzeichnis befindet. Im PHP Skript stehen alle Drupal Funktionen zur Verfügung, so als ob man eine Funktion innerhalb eines Modules ausführt. Auch die Datenbankabstraktion kann hier im vollen Umfang genutzt werden (auch die Angabe der Tabellen mit geschweiften Klammern). Zu beachten ist auch, dass innerhalb des Skriptes wie in jeder PHP Datei der Start und das Ende des PHP Blocks angezeigt werden muss, mit Hilfe von <?php und ?>. Wie bei jeder Ausgabe über das PHP CLI Interface ist die Ausgabe von HTML Code nicht erwünscht. Deshalb wurde im Skript als Zeilenumbruch nicht <BR> verwendet, sondern “\n”.

b) Ein neues Modul installieren und aktivieren

Als Beispiel verwende ich hier das Modul “Schema” (dieses Modul eignet sich übrigens hervorragend, um das Datenbankschema mit den Install-Datei-Definitionen abzugleichen - wie oft hat ein Entwickler vergessen einen Update-Hook zu definieren). Die Installation und die Aktivierung funktioniert völlig schmerzfrei mit folgenden Anweisungen:

drush pm install schema
drush mm enable schema
drush cache clear

Interpretation der Vorgehensweise: Die erste Anweisung installiert das Modul Schema, was bedeutet, dass das Modul von Drupal.org heruntergeladen wird und in das entsprechende Verzeichnis extrahiert wird. Mit der Anweisung mm enable schema wird das Modul aktiviert, was gleichbedeutend wäre mit dem Anklicken des Häckchens unter admin/build/modules und der Abspeicherung. Mit der letzten Zeile lösche ich den Cache um sicher zu stellen, dass auch das Menü die über das Modul zur Verfügung gestellten neuen Menüpunkte anzeigt.

Will man mehrere Module installieren, kann man dies mit einem einzigen Befehl erreichen:

drush pm install <module1> <module2> ... <moduleN>

c) Alle aktivierten Module auf die neuste Version aktualisieren

Mit den folgenden Anweisungen kann man alle aktivierten Module auf die neuste Version aktualisieren, die auf Drupal.org angeboten wird:

drush pm refresh
drush pm update
drush cache clear

Interpretation der Vorgehensweise: Die erste Anweisung aktualisiert die Referenzliste der Module mit den aktuellen Versionen. Mit pm update wird der eigentliche Update Prozess ausgelöst. Werden eine oder mehrere neuere Module auf Drupal.org gefunden, bekommt man eine Sicherheitsabfrage angezeigt, ob man wirklich das Update durchführen will. Bestätigt man, werden diese Module auf die neuste Version aktualisiert. Die vorherigen Module, die durch eine neuere Version ersetzt wurden, werden in ein Backup Verzeichnis abgelegt. Das Backup Verzeichnis befindet sich um Drupal Hauptverzeichnis mit dem Namen “backup” und beinhalten Unterverzeichnisse, die als Namen den Timestamp des jeweiligen Aktualisierungsvorganges besitzen. Das automatische Updaten ist mit Vorsicht zu verwenden und sollte auf jeden Fall erst in einer Entwicklungsumgebung getestet werden.

d) SQL Query ausführen

Ein SQL Query auf die Drupal Datenbank absetzen:

drush sql query "SELECT COUNT(*) FROM node"

Vorsicht, hier werden keine Eigenschaften des Drupal Datenbankabstraktionslayer unterstützt (wie z.B. die geschweiften Klammern für Tabellen).

e) Ausgabe der Watchdog Einträge

Für die Ausgabe der aktuellen Einträge in der Watchdog Tabelle genügt folgender Befehl:

drush watchdog show

f) Drupal Cron mit Drush ausführen

Der Drupal Cron kann einfach über folgendes Kommando ausgeführt werden:

drush cron

Der Vorteil bei der Verwendung von Drush besteht darin, dass kein weiteres Programm benötigt wird (wie z.B. lynx, wget oder w3m). Da man normalerweise den Cron über Crontab automatisiert ausführen will, muss man dazu folgendes Anweisung in die Crontab schreiben:

20  *   *   *   * drush cron

Interpretation der Vorgehensweise: Dieser Eintrag legt fest, dass jede Stunde (20 Minuten nach) der Job ausgeführt wird. Hinweis: Der Einsatz von Bash Aliases funktioniert als Definition eines Cronjob nicht. Um Drush zeitgesteuert auszuführen, bietet sich die Verwendung eines Bash-Wrapper Skript an.

Aktualisiert: