[django+apache+mod_python] Errno.13 Permission denied

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Rush08
User
Beiträge: 3
Registriert: Dienstag 5. Juli 2011, 13:36

Hiho!
Ich bin neu hier und bräuchte mal euren Rat in einer Sache :-)
Und zwar bin ich bei meinem aktuellen Django Projekt auf ein Problem gestoßen.
Ich möchte eine Zeile aus der Datei "/etc/bootptab" löschen. Das funktioniert auch soweit wenn ich das Ganze über den Django Development Server als Root starte.
Wenn ich dies jedoch über den Apache (mit mod_python unter Ubuntu 11.04) laufen lasse, bekomme ich folgende Fehlermeldung:

"OSError at /complete/0000
[Errno 13] Permission denied"

Die Datei /etc/bootptab gehört dem Apache User www-data und hat versuchshalber auch die Oktalrechte 777.

Hier ist meine Vhost Config:

Code: Alles auswählen

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
	SetEnv DJANGO_SETTINGS_MODULE myadmin.settings	

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /var/www/>
                Options +ExecCGI Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
	 </Directory>
	
</VirtualHost>
...und noch die httpd.conf falls hilfreich :-)

Code: Alles auswählen

<Location "/">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE myadmin.settings
    PythonDebug On
    PythonPath "['/var/www', '/var/www/myadmin'] + sys.path"
</Location>

<Location "/media">
    SetHandler None
</Location>

<Location "/phpmyadmin">
    SetHandler None
</Location>
Ich wäre euch echt dankbar wenn ihr mir ein paar Tipps geben könntet warum das Ganze nicht funktioniert :-))

Vorab vielen Dank!

Viele Grüße, Rush08
lunar

@Rush08: Beim Löschen einer Datei wirken die Zugriffsrechte des Verzeichnisses, die Zugriffsrechte der Datei sind ohne Belang. "/etc/" hat üblicherweise "root:root" als Eigentümer und die Rechte "0755". Es darf also nur der Benutzer "root" Dateien aus diesem Verzeichnis löschen.

Wie Du diese Einschränkung umgehen kannst, kann man Dir pauschal nicht sagen. Pauschal sehe ich persönlich einen Entwurfsfehler, wenn eine einfache Anwendung systemweite Konfigurationsdaten manipulieren muss. Einfache Webanwendungen sollten niemals mit "root"-Rechten laufen, weder im Entwicklungsserver noch im Apache.

Um Dir weiterzuhelfen, sind also mehr Details nötig, insbesondere hinsichtlich Sinn und Zweck dieser Löschaktion.
Rush08
User
Beiträge: 3
Registriert: Dienstag 5. Juli 2011, 13:36

Hallo Lunar!
Vielen Dank für die schnelle Antwort!
Hmmm, das stimmt wohl. Ich muss wohl etwas weiter ausholen :-)
Also bei der Anwendung handelt es sich um eine Serververwaltung, mit welcher man OS Images per PXE Boot auf verschiedene Server spielen kann.
Quasi ein Remote Install Tool. Die besagte Datei ist Bestandteil des bootp Paketes, welches die Config Datei bootptab unter /etc/ anlegt.
In dieser Datei wird ein Eintrag hinterlegt, welcher zum starten des ausgewählten Servers über PXE benötigt wird. Sobald die Installation des Systems abgeschlossen ist, muss der Eintrag aus der Datei bootptab wieder gelöscht werden, da der Server sonst in einer Restart Schleife hängt bzw. immer wieder per PXE bootet :-).
Von daher dachte ich mir, dass es praktisch wäre, wenn ich einfach vom Server aus eine URL aufrufe, die eine Funktion in Django aufruft, welche wiederum die Zeile aus der Datei löscht.

So habe ich das gelöst:

Code: Alles auswählen

def complete(request, mac):
        file = os.path.join('/etc/', 'bootptab')
	for line in fileinput.input(file, 'U' ,inplace =1):
            line = line.strip()
            if not mac in line:
                    print line
lunar

Reicht es, die Datei einfach zu leeren? Also:

Code: Alles auswählen

open('/etc/bootptab', 'w').close()
Rush08
User
Beiträge: 3
Registriert: Dienstag 5. Juli 2011, 13:36

Ja, also eigentlich würde das auch genügen.
Hab den Codeschnipsel gerade ausgetauscht, jedoch tritt der gleiche Fehler auf :-(
Antworten