# Fehlermeldung beim Löschen von Webseiten



## ramsys (3. Nov. 2014)

Wenn ich in ISPConfig (Multiserver-Setup) eine Webseite lösche, wird im System-Protokoll folgendes eingetragen:


> [INTERFACE]: DB::query(DELETE FROM `web_database_user` WHERE  = '') -> mysqli_query You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= ''' at line 1


Auf dem Server wird die Domain ordnungsgemäß in "/var/www" und auch die Datenbank in "/var/lib/mysql" gelöscht. Ebenso in den Tabellen "web_database", "web_database_user" und "web_domain", sowohl im Master als auch auf dem Slave.

Nur im Verzeichnis "/var/backup" bleiben die Backups erhalten.

Die Spalten der vor genannten Tabellen entsprechen der ispconfig3.sql aus dem Git stable-3.0.5-Branch. Hat jemand eine Idee, wo ich noch suchen könnte?


----------



## Till (3. Nov. 2014)

Hmm, gute Frage. Mach doch mal eine Volltextsuche nach "DELETE FROM `web_database_user` WHERE" um quelltext, es kann ja nicht allzu viele stellen geben, an der das steht. Und dann mal sehen waraus der where teil besteht und warum er leer sein könnte.


----------



## ramsys (3. Nov. 2014)

Zitat von Till:


> Hmm, gute Frage. Mach doch mal eine Volltextsuche


...gute Idee 

Es gibt im gesamten Code nur eine einzige Stelle, und zwar in in Zeile 58 von "interface/web/sites/database_user_del.php" ($index_field):

```
class page_action extends tform_actions {
    function onBeforeDelete() {
        global $app; $conf;
        if($app->tform->checkPerm($this->id, 'd') == false) $app->error($app->lng('error_no_delete_permission'));

        $old_record = $app->tform->getDataRecord($this->id);

        /* we cannot use datalogDelete here, as we need to set server_id to 0 */
        $app->db->query("DELETE FROM `web_database_user` WHERE $index_field = '$index_value'");
        $new_rec = array();
        $old_record['server_id'] = 0;
        $app->db->datalogSave('web_database_user', 'DELETE', 'database_user_id', $this->id, $old_record, $new_rec);
    }
```


----------



## Till (3. Nov. 2014)

Hmm, da passt doch was nicht. Ich habe es mal in den Bugtracker gschoben. Ich glaube wir haben das als event listener neu programmiert, möglicherweise ist das alter code. das würde auch erklären warum es trotzdem geht.


----------



## ramsys (3. Nov. 2014)

Zitat von Till:


> möglicherweise ist das alter code


Im aktuellen Git (stable-3.0.5/master) befindet sich exakt der gleiche Code:
http://git.ispconfig.org/ispconfig/...0.5/interface/web/sites/database_user_del.php


----------



## ramsys (4. Nov. 2014)

Noch eine ergänzende Frage:

Dass die Backups nicht gelöscht werden, hat das mit dem hier genannten Problem zu tun oder ist das ein Standardverhalten von ISPConfig und das Backup-Verzeichnis muss generell manuell gelöscht werden?


----------



## Till (4. Nov. 2014)

Mit dem Problem hier hat das nichts zu tun. Wenn ich mich recht entsinne hatten wir die absichtlich nicht gelöscht, da es ab und zu mal vorkommt dass jemand eine seite aus versehen löscht und wenn die Backups dann auch gleich mit weg sind, wäre das schon schlecht.


----------



## ramsys (4. Nov. 2014)

Und die Tabelle web_backup wird dann nicht durch Aktionen in ISPConfig geschrieben, sondern holt sich die Einträge durch einen Check des Filesystems? Soll heißen, wenn ein Backup bzw. das komplette Backup-Verzeichnis also manuell gelöscht werden muss, wird die Tabelle web_backup automatisch beim nächsten Dailycron aktualisiert?


----------



## florian030 (4. Nov. 2014)

In der nächsten Version ist, wenn ich mich nicht gerade extrem täusche, eine Option vorhanden, die dem Admin erlaubt, die Backups zusammen mit einer Domain automatisch zu löschen. Kann man machen, ich finde das aber eher riskant.


----------



## ramsys (5. Nov. 2014)

Zitat von Till:


> Wenn ich mich recht entsinne hatten wir die absichtlich nicht gelöscht, da es ab und zu mal vorkommt dass jemand eine seite aus versehen löscht und wenn die Backups dann auch gleich mit weg sind, wäre das schon schlecht.


Grundsätzlich hat es natürlich Vorteile, das Backup-Verzeichnis zunächst zu erhalten. Allerdings kann ein Endkunde ja im Rahmen seiner Limits beliebig Webseiten anlegen und löschen sowie bis zu zehn Backups erstellen lassen - ohne Kenntnis des Admin. Irgendwann läuft der Server dann voll und es ist ziemlich aufwändig und vor allem fehleranfällig manuell zu prüfen, welches Backup denn nun gelöscht werden könnte.



Zitat von florian030:


> In der nächsten Version ist, wenn ich mich nicht gerade extrem täusche, eine Option vorhanden, die dem Admin erlaubt, die Backups zusammen mit einer Domain automatisch zu löschen.


Das löst aber nicht das Problem, verwaiste Backups auf dem Server zu löschen. Und eine Umstellung auf "Backups gleich löschen" (sofern man das tatsächlich möchte) greift auch nur für die Zukunft und berührt keine vorhandenen Backups.

Sinnvoller als eine reine Ja/Nein-Lösung wäre die automatische Löschung nach einer bestimmten (einstellbaren) Anzahl von Tagen.


----------



## florian030 (5. Nov. 2014)

Du kannst doch mit einem Script problemlos testen, ob die zum Backup gehörenden Domains noch existieren. Jedes Backup liegt in einem eigenen Verzeichnis und die haben "zufällig" den Namen web$parent_domain_id.
Du musst nur /var/backup/web* mit bspw.  "ls /var/backup|grep web" einlesen und dann nachsehen, ob eine entsprechende Domain existiert. Mit "find -P /var/www  -maxdepth 1 -type l -exec echo -n "{} -> " \; -exec readlink {} \;" bekommst Du alle symlinks aus /var/www aufgelistet. In der Liste kannst Du dan nach $parent_domain_id suchen.
Das sollte per bash in ein paar Minuten zu schaffen sein.


----------



## ramsys (5. Nov. 2014)

Zitat von florian030:


> Du kannst doch mit einem Script problemlos testen,
> Das sollte per bash in ein paar Minuten zu schaffen sein.


Korrekt - und wenn man das gleich in die cron_daily.php packt und noch den Timestamp berücksichtigt wäre es perfekt. Wenn gerade sowieso an dieser Funktion gearbeitet wird, vielleicht kann man ja etwas derartiges noch integrieren


----------



## florian030 (6. Nov. 2014)

Ich denke, dass ist etwas überzogen. Dann müsstest Du zusätzlich noch ein Interval im Interface definieren. Das kann auch ein shell-script mit ein paar Zeilen. Sinnvoller wäre es wohl, eine Art clean-up-script in das Archiv zu packen, dass dann per Hand angepasst werden kann. Ich persönlich bin aber mehr an einem wrapper-script interessiert, um die einzelnen Cron-Jobs von ISPConfig manuell ausführen zu können (bspw. zwischendurch das Backup anstossen).


----------



## ramsys (6. Nov. 2014)

Zitat von florian030:


> Ich persönlich bin aber mehr an einem wrapper-script interessiert, um die einzelnen Cron-Jobs von ISPConfig manuell ausführen zu können (bspw. zwischendurch das Backup anstossen).


Ein zusätzlicher Tab "Wartung" im Interface unter Serverkonfiguration des jeweiligen Servers, wo die einzelnen Scripte (de)aktiviert werden können. Außerdem wird ein custom-Verzeichnis nach individuellen Scripten durchsucht. Für den Start kann eine Uhrzeit angegeben werden sowie die Möglichkeit der manuellen Ausführung.


----------

