Problem bei Löschung von Benutzern

  • Hi,


    im Zuge der confixx-Migration (cfximport.php wird benutzt), habe ich den ein oder anderen Reseller und Kunden auch mal wieder gelöscht, bis meine Migrationsprozedur so lief, wie sie laufen soll.


    Jetzt kriege ich einen User, der schonmal im System war, nicht mehr rein, und der Reseller (via --newreseller) wird nicht erkannt.


    Das Migrationsscript packt den User dann als Kunden zum LC "admin" user und vergibt den einzigen dort definierten Vertrag (Reseller). Wenn ich den so entstandenen User dann wieder lösche, ist unter "Wiederverkäufer Statistiken" der Wert für "Eigene Wiederverkäufer" korrekt auf 0, aber der für "Kunden insgesamt" steigt immer schön brav weiter um +1, obwohl weder Reseller noch irgendwelche Kunden im System aktiv sind.


    Die Probleme fingen an, als ich dem Reseller R1 einen zusätzlichen User X gegeben habe + einige Angebote und mich dann entschieden habe R1 zu entsorgen und als Reseller "X" wieder neu aufzusetzen. Obwohl ich X neu angelegt hatte, waren die Angebote (vorher unter R1 mit einem Zusatzuser X) sofort wieder verfügbar - ich vermute da wird was nicht sauber in der DB gelöscht worden sein?


    Wie werde ich das wieder los?
    Datenbanksicherung hätt ich griffbereit, aber ich will die auch nicht einfach drüberbügeln, wenns vielleicht noch anders geht?


    Das Migrationsscript behauptet der User (hier: web1) wäre schon vergeben und meckert entsprechend:
    "Fehler beim Soapaufruf UserAdd: Invalid login (already in use by another customer)"
    Ist er aber ja nicht (mehr).



    (LC 1.6.1 r2142, debian wheezy, Multiserver)

  • Ich war neugierig und habe mal in der Datenbank rumgestöbert.


    Der User-Table in der SQLite DB hat die alten User immer noch drin:



    sqlite> select * from users;
    1|1|1|admin|...
    2|1|2|<user1>|...
    3|1|3|<user2>|...
    6|4|6|web1|...



    <user1> und <user2> gibts auch schon nicht mehr im System als Login-User, lediglich als Kontakte.


    Die anderen Tabellen sehen auch nicht viel besser aus:



    sqlite> select * from customers;
    1|1|1|14|0|0|1|1|1|0|...
    4|3|1|14|3|1|6|6|6|0|...
    5|3|1|4|2|1|4|4|4|0|...
    7|3|5|14|6|1|7|7|7|0|...
    10|3|7|14|9|1|8|8|8|0|...
    12|3|9|14|11|1|10|10|10|0|...
    14|3|11|14|13|1|11|11|11|0|...



    Und das, obwohl es keinen einzigen Kunden und Reseller mehr im System gibt.


    Hier noch die Reseller-Tabelle:


    sqlite> select * from resellers;
    1|support@rising-systems.de||logo38d2cbc8ed.png|1||14|1|0|web|1|10|1|||
    2|support@rising-systems.de|||0||2|1|0|web||1|0|||
    3||||0||4|10|1|web|1|10|1|||
    6||||0||8|10|1|web|1|10|1|||
    9||||0||8|10|1|web|1|10|1|||
    11||||0||8|10|1|web|1|10|1|||
    13||||0||11|10|1|web|1|10|1|||



    Gibts auch keinen einzigen mehr von.


    Bei den Hostingplans ebenfalls:


    sqlite> select * from hostingplans;
    2|1|3|Premium Reseller|-1|-1|-1|-1|-1|-1|-1|-1|-1|1|1|1|2|-1|-1|2|-1|-1|
    3|2|4|Standard||10|-1|-1|-1|-1|25|100|-1|1|1|1|2|10|5|0|5|0|
    4|2|5|Mini||5|-1|-1|-1|0|5|10|-1|1|0|1|2|2|3|0|0|0|
    7|3|8|Standard||10|-1|-1|-1|-1|25|100|-1|1|1|1|2|10|5|0|5|0|
    8|3|9|Mini||5|-1|-1|-1|0|5|10|-1|1|0|1|2|5|3|0|0|0|
    9|2|10|Premium||-1|-1|-1|-1|-1|-1|-1|-1|1|1|1|2|-1|-1|0|-1|0|
    10|8|11|orange Mini||3|-1|-1|-1|-1|5|20|-1|1|1|1|2|3|3|0|0|0|
    11|8|12|orange Standard||10|-1|-1|-1|-1|25|100|-1|1|1|1|2|5|5|0|3|0|



    Hier gibts nur noch "Premium Reseller" (der dem einzigen User "admin" zugeordnet ist), die anderen sind alle inzwischen gelöscht (also zumindest theoretisch :-).


    Offensichtlich hakts bei der Löschung von Usern/Resellern.
    Ich kenne die Abhängigkeiten der SQL-DB natürlich nicht, aber ich habe ja die schwache Hoffnung, dass ich die überflüssigen Einträge einfach rauswerfen kann ohne damit an anderer Stelle eine Katastrophe auszulösen?


  • Da ist ernsthaft etwas in der Datenbank korrupt. Die Spalten 2-4 (CUST_IDLEVEL, CUST_IDLEFT und CUST_IDRIGHT) dienen der Verwaltung der Struktur/Hierarchie der Kunden. Hier gibt es neben dem Admin (CUST_ID=1, CUST_IDLEVEL=1) nur noch Kunden mit der Ebene CUST_IDLEVEL=3 - da fehlt also was. Auch die Baumstruktur (Nested Set mit IDLEFT/IDRIGHT) ist fehlerhaft.


    Haben Sie eventuell mal manuell in die Tabelle CUSTOMERS eingegriffen?


    Falls nicht, wäre es natürlich hochinteressant, ob sich dieses Verhalten mit einer "frischen" Datenbank reproduzieren lässt.


    Welche Kunden/Reseller/Benutzer sollen denn am Ende noch übrig bleiben? Die überflüssigen Einträge könnten Sie durchaus direkt in der Datenbank löschen, allerdings muss dann noch die Baumstruktur in der CUSTOMERS-Tabelle korrigiert werden.
    Schicken Sie uns einfach nach dem Löschen noch mal die selben Tabellen-Dumps wie im obigen Forums-Beitrag an support@liveconfig.com, dann kann ich Ihnen die notwendigen Korrektur-SQLs zurück schicken.


    Viele Grüße


    -Klaus Keppler

  • Sooo, nun war Zeit zum Testen.


    Es sieht so aus als würde cfximport.php, bzw. die SOAP-Schnittstelle, empfindlich auf Großbuchstaben in Vertragsnamen reagieren.


    Ich hatte dem primären Reseller 2 verschiedene Resellerverträge (Beispiele) "A" und "B" zugeordnet - die jeweils für andere Server stehen. Wenn ich dann cfximport mit --newreseller A aufrufe gibts großes Chaos. Ein so ins System importierter Kunde erzwingt einen neuen Reseller auf Basis der confixx-Werte und diesen Reseller kann ich in LC löschen, ohne dass ich seine Kunden entsorgt habe - daher kamen die Differenzen bei der Kundenanzahl.


    Ein zweites Problem war zwischen meinen Ohren. Ich hatte als Prefix für Verträge "web" definiert und wundere mich dann über angemeckerte Doppeluser, wenn ich "web1" als _KUNDE_ importiere.


    Die Lösung war letztendlich die Resellerverträge neu zu machen als "a" und "b" .. und *TADAAAAA*: klappt.


    In der SOAP-Schnittstellenbeschreibung steht für das entsprechende Feld in HostingSubscriptionGet() auch:


    subscriptionname string ^[a-z][a-z0-9_-]{0,63}$ no Vertragsname


    Doof nur, wenn man beim Anlegen übers Webinterface Großbuchstaben verwenden darf und das auch tut :)


    Also vielleicht das Webinterface restriktiver oder die SOAP-Schnittstelle schlauer machen?


    Gruß


    /Byte

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!