2009-08-06 10 views
2

Gibt es eine Möglichkeit, hook_cron mit Administratorrechten ausführen zu lassen - z. B. eine Art von sudo hook_cron() sozusagen?Ausführen von hook_cron mit Administratorrechten in Drupal 6

Diese Frage ist bis zu my earlier question folgen zu diagnostizieren versucht, warum hook_cron() funktioniert anders von /drupal/cron.php Laufe aufgerufen, dass die gleichen Funktionen von /admin/reports/status/run-cron aufgerufen.

Meine spezielle Funktion (nennen Sie es foo_cron()) aktualisiert Benutzerprofile als Teil seiner nächtlichen Aufgaben. Aber, /drupal/cron.php läuft anscheinend als anonymer Benutzer. Anonyme Benutzer können Benutzerprofilfelder auf dieser Site aus offensichtlichen Gründen nicht ändern, so dass dieser Teil des Skripts fehlschlägt.

Ich weiß, ich kann umgehen, indem Sie profile_fields direkt mit SQL ändern, aber das fühlt sich an wie ein hässlicher Hack, und könnte schwer zu pflegen, wenn ich damit in mehreren Modulen zu tun.

Ist die Möglichkeit, innerhalb der bestehenden Drupal-Funktionen und -Framework bestimmte foo_cron() - Jobs mit privs auszuführen, die wir normalerweise nur Administratoren geben, wie zum Beispiel das Aktualisieren von Profilen?

Auf dieser speziellen Website läuft Drupal 6.1.3.

Antwort

2

Von drupal cron manual page: Lauf cron als authentifizierter Benutzer

#!/bin/sh 
# Reference http://drupal.org/node/479948#comment-1673488 by pearlbear 

SITE=https://dev.example.com/ 
USERNAME=user.name 
PASS=ChangeMe!!12 

COOKIES=/tmp/cron-cookies.txt 
WGETPARAMS="--quiet -O /dev/null --no-check-certificate --save-cookies $COOKIES --keep-session-cookies --load-cookies $COOKIES" 
# if you run drupal in a default language different than English you need to modify this 
LOGIN="Log%20in" 

wget $WGETPARAMS "${SITE}user" 
wget $WGETPARAMS --post-data="name=$USERNAME&pass=$PASS&op=$LOGIN&form_id=user_login" "${SITE}user" 
wget $WGETPARAMS " ${SITE}cron.php" 
+0

Perfekt ... danke! – anschauung

+0

Es gibt ein kleines Problem mit dieser Lösung, in der letzten Zeile haben Sie einen zusätzlichen Platz innerhalb der Bindestriche. Bitte ändern Sie es, da es schwierig ist, in einer cpanel-Umgebung zu debuggen. – Andrei

+0

Um dies mit cPanel zu verwenden, müssen Sie möglicherweise auch "/ bin/sh" vor dem Shell-Skriptpfad hinzufügen. – Andrei

1

Alles, was Sie tun müssen, ist die globale Variable $ user zu speichern, dann ändern Sie $ user global in einen Benutzer mit dieser Berechtigung und ändern Sie den Benutzer dann wieder zurück.

Jetzt würde ich nicht empfehlen, aber würde vorschlagen, dass Sie stattdessen SQL verwenden, da dieser Ansatz sehr hacky und möglicherweise ein wenig unsicher ist, Cron-Jobs mit admin privs auszuführen.

+0

Könnten Sie ein bisschen näher ausführen, warum global $ Benutzer verwenden ist hackier als SQL verwenden? Mein eigener Gedanke ist, dass SQL Hacker ist, weil es außerhalb von Drupal geht, um eine Drupal-Aufgabe abzuschließen, aber ich bin gespannt, was dich dazu gebracht hat. – anschauung

+1

Es ist der Kern von Drupal Core, der den Wert der globalen Variablen (während des Bootstrap glaube ich) setzt. Also den Wert von einem temporär zu verändern (was den ganzen Effekt von Drupal betrifft) ist hackiger als ein bisschen SQL selbst zu schreiben, das die Funktion sowieso erzeugen würde. – googletorp

Verwandte Themen