Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plugin bricks OID-IP and RDAP on systems with 50.000+ OIDs #17

Closed
danielmarschall opened this issue Dec 26, 2023 · 76 comments
Closed

Plugin bricks OID-IP and RDAP on systems with 50.000+ OIDs #17

danielmarschall opened this issue Dec 26, 2023 · 76 comments

Comments

@danielmarschall
Copy link
Collaborator

Hello Till,

The ViaThinkSoft OID RA has gained 50.000+ OIDs in a private arc, and it turns out that your plugin will crash (30 seconds timeout) the OID-IP and OID-RDAP if there are so many OIDs in the database.

I had to implement a dirty emergency fix to make my system work again:
https://github.com/danielmarschall/oidplus/blob/master/plugins/frdl/publicPages/altids/OIDplusPagePublicAltIds.class.php#L112

We need to find a solution to make this work properly. The parsing and alt-id generation is too slow so we cannot do it for all OIDs every time the user visits the page. If we cache it, then we need to take care that the cache does not refreshed at once, otherwise we would have a crash again.

@wehowski
Copy link
Member

wehowski commented Dec 28, 2023

Hi Daniel,
sorry for the delay!

I added a new PRE-version:

  • moved everything from the cache(file) to SQL
  • removed readAll()

Question:
As readAll was removed the new version only saves the altIds per ONE single ID, but this should happen when the entry was added/requested the first time!!??
So we may have no guarantee that all altIds are fetched in every case? ???

Please, can you take a look into the new versioncommit? If you confirmed we can add a new release?

@wehowski
Copy link
Member

...I'm not quite sure why implementsFeature was removed? Was it because of the new Interfaces, or did I an accident?

@wehowski
Copy link
Member

wehowski commented Dec 28, 2023

ToDo:

@wehowski
Copy link
Member

wehowski commented Dec 28, 2023

I did additonal commits to provide compatibillity to the composer plugin and add your funding, so this is the commit you have to review:
e71b563

@danielmarschall
Copy link
Collaborator Author

...I'm not quite sure why implementsFeature was removed? Was it because of the new Interfaces, or did I an accident?

implementsFeature() is depreacted some time ago. To include a "feature", you now just need to include a real PHP interface, which must start with "INTF_OID_", so that the OIDplus Autoloader knows that this interface is optional and non-critical.

	implements INTF_OID_1_3_6_1_4_1_37476_2_5_2_3_4, /* whois*Attributes */
	           INTF_OID_1_3_6_1_4_1_37476_2_5_2_3_7  /* getAlternativesForQuery */

@wehowski
Copy link
Member

wehowski commented Dec 28, 2023

I should hat remember.
Tipp: INSTEAD of to copy this repo manualy to the core source code (if confirmed and new release), you can use the new composer-plugin and composer!!!

  • It should work without you to have to change any OIDplus core code, but please test it before you release!!!

It should work this way (I have tested it successfully with the io4- plugin before):

  • in the main OIDplus core composer.json file require frdl/oiplus-composer-plugin
  • And further (like any other compatible plugin) require frdl/oidplus-plugin-alternate-id-tracking

EDIT: composer-plugins should be required first in the composer.json require list, before the other dependencies!!!

@wehowski
Copy link
Member

Ooops, sorry! WEID ist wieder dabei: 52f3005

@danielmarschall
Copy link
Collaborator Author

Hallo Till,
danke für die schnelle Anpassung!

Ein paar Anmerkungen / Fragen:

  • Funktioniert das Plugin nun wie bisher auch? (Also auch dass Rückwärtssuchen möglich sind, etc.?)
  • Was ist wenn man das Plugin erstmalig einsetzt, muss er dann nicht zehntausende von AltIDs auf einmal nachtragen?
  • Problem mit Datenbanktabellen ist, dass die OIDplus Lösung für alle bekannten DBMS funktionieren muss. Zwingend erforderlich sind Microsoft SQL Server und MySQL. In SQL Server gibt es das Replace Into nicht... und eigentlich müssten auch Oracle, PgSql, SqLite, und Access angebunden werden. :-(

@wehowski
Copy link
Member

wehowski commented Dec 28, 2023

Problem mit Datenbanktabellen ist, dass die OIDplus Lösung für alle bekannten DBMS funktionieren muss. Zwingend erforderlich sind Microsoft SQL Server und MySQL. In SQL Server gibt es das Replace Into nicht... und eigentlich müssten auch Oracle, PgSql, SqLite, und Access angebunden werden. :-(
Ah, Mist, sorry das wußte ich nicht. Dann müssen wir für den Part eine Alternative finden/vor dem INSERT prüfen ob der Eintrag vorhanden ist.

Was ist wenn man das Plugin erstmalig einsetzt, muss er dann nicht zehntausende von AltIDs auf einmal nachtragen?
Nein: Es werden pro requests nur die AltIds EINES Eintrags ermittelt und gespeichert, vorausgesetzt jeder Eintrag wurde schon mindestens einmal aufgerufen sollten dann alle AltIds entsprechend abrufbar sein.

Im alten Code hast Du zwei arrays, eins mit der Verknüpfung orig<-> alt und ein array mit alt<->orig.
Im neuen commit nur eine Tabelle mit zwei Feldern orig,alt.
Abgesehen von der Geschwindigkeit/timeout hat mysql vs. die zwei Arrays noch den Aspekt das das Array bei sehr vielen Einträgen memory frist?

Funktioniert das Plugin nun wie bisher auch? (Also auch dass Rückwärtssuchen möglich sind, etc.?)
Ich will mich jetzt nicht darauf festnageln es schon ausreichend getestet zu haben aber es ist so angedacht!?

Was das replace into betrifft würde ich vorher einen zusätzlichen Select query ausführen und dann ggf. entsprechend das Insert ausführen wenn der Eintrag (in der altids Tabelle) nicht vorhanden ist? Vielleicht kannst Du das irgendwie in einem query (ich müsste erst googeln...)?
...

@wehowski
Copy link
Member

wehowski commented Dec 28, 2023

Was das replace into betrifft würde ich vorher einen zusätzlichen Select query ausführen und dann ggf. entsprechend das Insert ausführen wenn der Eintrag (in der altids Tabelle) nicht vorhanden ist? Vielleicht kannst Du das irgendwie in einem query (ich müsste erst googeln...)?
Hab das geändert und REPLACE INTO entfernt, aber es sieht mir nicht wirklich elegant aus???
62ac62c

@wehowski
Copy link
Member

wehowski commented Dec 28, 2023

Sorry, hab das vielleicht nicht ganz richtig verstanden:
Was ist wenn man das Plugin erstmalig einsetzt, muss er dann nicht zehntausende von AltIDs auf einmal nachtragen?
Beim Neueintrag/Neuinstallation sollten eigentlich die AltIds bei Speichern/Eintragen durch das erstmalige aufrufen gespeichert werden (?)?
Bei einer bestehenden Installation sind natürlich die Einträge nicht alle vorhanden sondern werden erst automatisch nachgetragen sobald sie erstmalig jeweils aufgerufen werden.

Man könnte das in einem Background-Script/Cronjob lösen ALLE Einträge zu berechnen/einmal zu requesten, z.B.???

@wehowski
Copy link
Member

Mal zur Klarstellung kurze Frage wie das gedacht ist:
Wann wird getAlternativesForQuery jeweils aufgerufen?

  • beim Aufruf der Seite/pagePlugins
  • RDAP
  • Whois
    Bin mir da grad nicht 100% sicher?
    Einerseits bezüglich wann die Berechnung stattfindet (s.o.) und damit keine callstack-recursion von getAlternativesForQuery auftaucht?!

@wehowski
Copy link
Member

Noch ein Performance-Tipp: Statt Arrays sollte man Traversables iterieren!
Aber bitte google das mal, sonst spiel ich mich hier als Experten auf und erzähl Dir am Ende noch was falsches.

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Dec 28, 2023

Hallo Till,

ich teste das morgen gleich mal aus.

Wenn ich mich recht erinnere ist das AltID-Plugin derzeit auch ein 404-Handler.

Aktuelles Verhalten:

  • Wenn ich nach "abc:xyz" suche, und es dieses Objekt nicht gibt, dann schaut er sich alle Objekte an und überlegt, ob "abc:xyz" eines der Alt-IDs dieses Objekts ist.

Neues Verhalten:

  • Er muss nicht mehr alle Objekte anschauen, sondern guckt in der Nachschlage/Cache-Tabelle nach
  • Die Frage ist, wenn ich jetzt das Plugin einspiele in mein System mit 50.000 OIDs, was passiert wenn ich nun einen solchen 404-Fehler hervorrufe? Da die Lookup/Cache-Tabelle leer ist, muss er ja dann doch erstmal alle Objekte durchsuchen, und dann gibt es doch einen Timeout, oder?

PS: Es sind übrigens 64.000 OIDs und ca. 400.000 Logbucheinträge in meinem Produktivsystem. OIDplus kommt gewaltig an die Grenzen und ich muss viele Entscheidungen überdenken. Ein guter Stresstest...


EDIT:

OIDplusPagePublicObjects arbeitet wie folgt... (Also nicht mit 404 handler)
Wenn also getAlternativesForQuery() bidirektional ist, dann müsste der Code wie bisher funktionieren.
Ich befürchte aber dass es NICHT bidirektional ist, denn ansonsten hätten wir den readAll() Quatsch niemals gebraucht???

			// --- Try to find the object or an alternative

			$test = $this->tryObject($id, $out);
			if ($test === false) {
				// try to find an alternative
				$alternatives = $this->getAlternativesForQuery($id);
				foreach ($alternatives as $alternative) {
					$test = $this->tryObject($alternative, $out);
					if ($test !== false) break; // found something
				}
			}
			if ($test !== false) {
				list($id, $obj, $objParent) = $test;
			} else {
				$objParent = null; // to avoid warnings
			}

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Dec 28, 2023

Limit 1 gibt's in SQL Server nicht :-) Ist rein MySQL

--> fixed in 2f7190d

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Dec 28, 2023

ToDo:

  • remove altIds from table if object is deleted

Auf das Löschen eines Objekts kannst du mit dem Interface INTF_OID_1_3_6_1_4_1_37476_2_5_2_3_3 reagieren.

TODO: Hier bitte folgende Funktionen implementieren:

  • afterObjectDelete: Selbsterklärend.
  • dann after insert, update usw. : saveAltIdsForQuery aufrufen
  • Die anderen Methoden des Interfaces machst du mit leerem Körper.

==> Ausgelagert in Issue #19

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Dec 28, 2023

Ok... ich erinnere mich wieder, warum wir den Quatsch mit "readAll" machen mussten!

Folgendes Beispiel:

Die OID oid:1.3.6.1.4.1.37553.8.8.2 hat die Alt ID guid:605e40cf-d500-3d1b-8100-63bf368203a1 .

Aber NICHT umgekehrt. Denn eine Hash-Funktion geht ja nur in eine Richtung.

Wenn ich also rechts oben in der GoTo-Box den String guid:605e40cf-d500-3d1b-8100-63bf368203a1 eingebe, dann muss er alle Objekte durchschauen, ob irgendein Objekt behauptet, dass guid:605e40cf-d500-3d1b-8100-63bf368203a1 eine Alt-ID von ihm ist.

Deswegen habe ich in getAlternativesForQuery zuerst ein readAll machen müssen.

Durch die Lookup-Tabelle fällt zwar readAll weg. ABER : Die Datenbanktabelle muss trotzdem einmalig initial befüllt werden (quasi doch nochmal ein readAll) . Diese einmalige Füllung könnte man am besten machen , wenn wir die Tabelle erstellen. Aber wie machen wir das? Bei den 50.000 OIDs kackt alles ab, weil mein Server nach 5 Minuten einen Timeout gibt.

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Dec 28, 2023

Idee:

  • Wir können gucken, ob es ein Cronjob ist, in dem man guckt ob das Script cron.php heißt. Dann wird die Tabelle ganz befüllt. Oder vielleicht maximal 10-50 Objekte pro Lauf? (cron.php ist übrigens im Lieferumfang! ) --> TODO. Ausgelagert in Implement cronjob #20

  • Leute die keinen Cronjob verwenden, die müssten einfach warten oder darauf hoffen, dass der Google Crawler mal durch alle Objekte durchgeht, und sich die Alt-ID-Tabelle dann Stück für Stück von selbst füllt. --> fixed in ab89e8e (allerdings TODO: eine sauberere Lösung finden)

@danielmarschall
Copy link
Collaborator Author

Es gibt hier große Denkfehler...

saveAltIdsForQuery darf nicht in getAlternativesForQuery aufgerufen werden. Andersrum, saveAltIdsForQuery müsste aufgerufen werden, wenn ein X-beliebiges Objekt geöffnet wird (um den Cache zu füllen.) Wenn wir getAlternativesForQuery aufrufen, dann wollen wir anders herum gucken!

Fixed in ab89e8e (zumindest mit einem unsauberen Hack...)

@wehowski
Copy link
Member

wehowski commented Dec 29, 2023

$resQ = OIDplus::db()->query("select origin, alternative from ###altids"); statt $resQ = OIDplus::db()->query("select origin, alternative from ###altids WHERE origin = ? OR alternative = ?", [$id,$id]); ist ja fast das gleiche wie vorher?
Warum wieder die GANZE Tabelle abrufen und nicht nur relevante Einträge?

Die Datenbanktabelle muss trotzdem einmalig initial befüllt werden Das betrifft nur bestehende Installationen. Deshalb meine Frage, wenn getAlternativesForQuery aufgerufen wird. (s.o.)

`Aber NICHT umgekehrt. Denn eine Hash-Funktion geht ja nur in eine Richtung.

Wenn ich also rechts oben in der GoTo-Box den String guid:605e40cf-d500-3d1b-8100-63bf368203a1 eingebe, dann muss er alle Objekte durchschauen, ob irgendein Objekt behauptet, dass guid:605e40cf-d500-3d1b-8100-63bf368203a1 eine Alt-ID von ihm ist.`
Deshalb ja das Nachschlagen in der Tabelle.

Wir können gucken, ob es ein Cronjob ist, in dem man guckt ob das Script cron.php heißt.
...oder ob die PHP_SAPI /cli/ ist, denn nur dann machen endlos oder "langzeit" Scripte Sinn.

Es gibt hier große Denkfehler... Muss mir Deine Beiträge morgen früh/gleich in Ruhe durchlesen...

@danielmarschall
Copy link
Collaborator Author

Hallo Till,

ja, er muss durch die ganze Tabelle durchgehen, denn ansonsten ist der folgende Case nicht abgedeckt:

		// Consider the following testcase:
		// "oid:1.3.6.1.4.1.37553.8.8.2" defines alt ID "mac:63-CF-E4-AE-C5-66" which is NOT canonized!
		// You must be able to enter "mac:63-CF-E4-AE-C5-66" in the search box, which gets canonized
		// to mac:63CFE4AEC566 and must be solved to "oid:1.3.6.1.4.1.37553.8.8.2" by this plugin.
		// Therefore we use self::special_in_array().

Vereinfacht gesagt, ich versuche mac:63CFE4AEC566 zu finden. Aber diese Adresse wird in alternative nicht auffindbar sein, denn dort ist nur mac:63-CF-E4-AE-C5-66 drin. Deswegen gehe ich durch alle durch und versuche mit special_in_array den richtigen Eintrag zu finden...

(TODO: Ich muss mal prüfen, ob es vielleicht möglich wäre, die kanonisierten AltIds in die Tabelle einzutragen, dann geht es vielleicht mit dem direkten Lookup)

Bzgl. Cronjob: Ja, wir können auch CLI. In diesem Fall ruft cron.sh oder cron.bat dann die cron.php auf. Natürlich können wir dann auch nach PHP_SAPI prüfen, um zu bestimmen, ob wir etwas zeitaufwändiges machen oder nicht.

@wehowski
Copy link
Member

ja, er muss durch die ganze Tabelle durchgehen, denn ansonsten ist der folgende Case nicht abgedeckt:
Nein. Tut mir leid, ich muss wirklich erstmal alles lesen und verstehen und bin auch ehrlich gesagt grad mit was anderes abgelenkt und hab schlecht geschlafen. Aber da komm ich spontan nicht ganz mit:

  • Die Einträge sind ja abgespeichert und verfügbar wenn Sie VORHER abgerufen wurden für das REVERSE Look-Up, alle benötigten Einträge sind da irgendwann nur halt nicht gleichzeitig.
  • Wenn Du für [...] ALLE Berechnungen für ALLE Einträge bei JEDEM Request, _AUSSER in einem Background-Job_ berechnen willst, dann ist irgendwas an Deinem Design falsch, bzw. es wird ab einer gewissen Zahl Einträge in einem Web-Request ZWANGSLÄUFIG zu Performance-Problem kommen.

Oder?

@wehowski
Copy link
Member

(TODO: Ich muss mal prüfen, ob es vielleicht möglich wäre, die kanonisierten AltIds in die Tabelle einzutragen, dann geht es vielleicht mit dem direkten Lookup)
Ich würde nicht alle verfügbaren Relationen in nur einer einzigen Tabelle abbilden unbedingt, je nach Anwendungsfall und Format, wenn Du die objects Tabelle meinst?
Die altids Tabelle aus den obigen commits hat zwei Felder, orig,alt die kannst Du auch mit OR in beide Richtungen und nur einem Query abfragen?

@wehowski
Copy link
Member

LIMIT 1 bei SQL... .
Sorry, wusste ich nicht.
Mh.

@wehowski
Copy link
Member

Generell, für die meisten DB-Designs, so hab ich das jedenfalls bisher gesehen (?), empfiehlt es sich Tabellen mit Keys und Relationen anzulegen und separate Tabellen für andere Sachen/Attribute wie z.B. description, RA, Title, usw... im Extremfall für jeden Container eine Tabelle oder key,value,id Tabellen oder ähnliches...?
Aber wie gesagt, SQL/DB/Query mäßig bist Du vielleicht noch fitter als ich....!?!

@wehowski
Copy link
Member

...P.S.: Sorry: Hab bisher Erfahrung mit MySQL/MariaDB, SQLite und minimal PostgreSQL,

  • Microsoft SQL, Oracle usw. habe ich noch nie praktisch eingesetzt oder getestet soweit ich weiß,
    war bisher als PHP-ler für mich halt alles PDO, ist aber wohl doch nicht ganz so... .

@danielmarschall
Copy link
Collaborator Author

Ja, PDO unterstützen wir ja auch, aber der SQL-Dialekt ist bei jeder Sprache anders. Deswegen ist es eine große Herausforderung, alle DBMS abzudecken.

@wehowski
Copy link
Member

wehowski commented Dec 30, 2023

Hallo Daniel,
so richtig zufrieden bin ich mit Deiner Version nicht, da ich finde es ist irgendwie der alte Ansatz!

Ich habe das teilweise rückgängig gemacht und OIDplus::prefilterQuery in saveAltIdsForQuery hinzugefügt/verschoben:

	// I do not get this? Similar to versions before (readAll) and why !in_array but if in special_in_array?
        //  mac:63CFE4AEC566 and must be solved to "oid:1.3.6.1.4.1.37553.8.8.2":
	//  -> moved to "where  if we save entries" NOT read all!?!

https://github.com/frdl/oidplus-plugin-alternate-id-tracking/blob/8cef10d0dcff6eed0c55cd4a186cbeec74c5d5d4/OIDplusPagePublicAltIds.class.php

Viele Grüße
Till

EDIT: https://registry.frdl.de/plugins/frdl/publicPages/1276945_rdap/rdap/rdap.php?query=oid%3A1.3.6.1.4.1.37553
Funktioniert:

-- | --
0 | "aid:D276000186B200055912E35B43E584C7"
1 | "aid:D276000186F037553F"
2 | "aid:D276000186F62B0601040182A531"
3 | "guid:5912e35b-0000-8000-a6d3-2293db8533f9"
4 | "guid:5b8ed73b-1489-36af-af4b-23268c7c0151"
5 | "guid:ab58e6c0-7143-536c-a383-f35532d6d9ff"
6 | "iana-pen:37553"
7 | "mac:B2-8C-C3-E5-84-C7"
8 | "mac:B28CC3E584C7"
9 | "mac:B3-8C-C3-E5-84-C7"
10 | "mac:B38CC3E584C7"
11 | "weid:pen:SZ5-8"
12 | "x500dn:/dc=com/dc=example/cn=oidplus/1.3.6.1.4.1.37476.2.5.2.9.4.1=1494410075/1.3.6.1.4.1.37476.2.5.2.9.4.2=1139115207"

Ob es aber auch performanter ist wie ich behaupte? Ich vermute es habe es aber nicht gemessen!?!

@wehowski
Copy link
Member

wehowski commented Dec 30, 2023

Als eine ID kanonisieren oder als wie ausgezeichnet als alternative behandeln??? :-)

7 | "mac:B2-8C-C3-E5-84-C7"
8 | "mac:B28CC3E584C7"

Edit: Wenn dann aber nur im jeweiligen Array des Eintrags und nicht in dem der gesamten DB-Tabelle!?!

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Jan 30, 2024

Solution for the first problem: Include weid to the alt-id plugin. The altid section at the bottom of the page could hard-coded filter out "oid => weid" entries, because weid is already described in the notation part. I will do it this way.

@danielmarschall
Copy link
Collaborator Author

But that reminds me, if we re-add this, then there will be double output for prefiltered stuff in OID-IP again.
That topic gets quite complex. Can you please try drafting a fix and then ask me for feedback? Many thanks.

@wehowski
Copy link
Member

Hallo Daniel,
ich hab einen neuen commit hochgeladen, aber ich check das grad irgendwie nicht:


es wird in print_r($res) alles angezeigt mit WEID und altIds, aber es hat keinerlei Auswirkungen, d.h. ich sehe nichts davon auf der ObjectPage und nicht im RDAP und nicht im OID-IP/Whois.
mh?

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Jan 30, 2024

Answer 1: Why isn't it shown in OID-IP?

Because in OIDplusPagePublicAltIds::whoisObjectAttributes(), I commented it out earlier:

	// DM 28.01.2024 Fix that OID-IP output shows both prefiltered and nonfiltered identifiers
	//$tmp = $this->getAlternativesForQuery($id);
	$obj = OIDplusObject::parse($id);
	$tmp = [];
	foreach ($obj->getAltIds() as $altId) {
		$tmp[] = $altId->getNamespace().':'.$altId->getId();
	}

then we have an OID-IP output of

alternate-identifier:  mac:62-CF-E4-AE-C5-66
alternate-identifier:  mac:63-CF-E4-AE-C5-66

If I change it back to

	$tmp = $this->getAlternativesForQuery($id);
	/*
	$obj = OIDplusObject::parse($id);
	$tmp = [];
	foreach ($obj->getAltIds() as $altId) {
		$tmp[] = $altId->getNamespace().':'.$altId->getId();
	}
	*/

then we have the problem in OID-IP and OID-RDAP show

alternate-identifier:  mac:62-CF-E4-AE-C5-66
alternate-identifier:  mac:62CFE4AEC566          <-- remove!!!
alternate-identifier:  mac:63-CF-E4-AE-C5-66
alternate-identifier:  mac:63CFE4AEC566          <-- remove!!!
alternate-identifier:  weid:8-2-2

Answer 2: Why isn't it shown in OID-RDAP?

I can't tell, because OID-RDAP crashes on my system if I have 50k+ OIDs.
If I interprete your source code correctly, then OIDplusRDAP::rdapQuery() simply calls OIDplusPagePublicObjects::getAlternativesForQuery($query), which should query all plugins.

Answer 3: Why isn't it shown in the GUI Object Page?

It turns out that OIDplusPagePublicObjects::gui() only shows the entries that $obj->getAltIds() offers.
OIDplusPagePublicObjects::getAlternativesForQuery() (which calls all plugins) is not executed.
... I believe this is a problem... (TODO)

The "alt id" topic becomes very uncomfortable....

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Jan 30, 2024

Furthermore, $obj->getAltIds() has a completely different structure as OIDplusPagePublicObjects::getAlternativesForQuery($obj->nodeId(true));

getAltIds() has an array of OIDplusAltId which is a tuple of (NS, ID, Description, Suffix, MoreInfoUrl).

while getAlternativesForQuery only outputs an array of strings.....

The reason for this is simple:

  • getAltIds() of an OBJECT was meant to be shown to the user at the GUI (or maybe even OID-IP and OID-RDAP if we only take "NS:ID" and don't include Description/Suffix/MoreInfoUrl)
  • getAlternativesForQuery() was meant to show alternatives of a QUERY (doesn't need to be an existing object!)

I wish these two could be combined though, because it is confusing.

I begin to think OID-IP and OID-RDAP should rather show getAltIds() like the GUI does, and not getAlternativesForQuery() ???

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Jan 30, 2024

GUI shows $obj->getAltIds() (= array of OIDplusAltId)

OID-IP shows whoisObjectAttributes (which should call the method in the frdl-altid plugin, INTF_OID_1_3_6_1_4_1_37476_2_5_2_3_4)

OID-RDAP shows OIDplusPagePublicObjects::getAlternativesForQuery (which should call the method in the frdl-altid-plugin, INTF_OID_1_3_6_1_4_1_37476_2_5_2_3_7)

We must that make equal. GUI, OID-IP, and OID-RDAP should show the same things and not 3 different APIs. What a mess

@wehowski
Copy link
Member

wehowski commented Jan 30, 2024

  • Btw. I plan to rewrite the (standalone + oidplus) RDAP completly!
  • I would have suggested to just use array_unique but you say you have objects on getAltIds()
  • Maybe the confusion is about the additional table, ...
  • ... which was introduced for getAlternativesForQuery for the REVERSE look-up
  • This was working in a prevoius version on my site but was commented out due to
    • doublicates
    • performance
      ~~
      I suggest to re-follow the approach it was working before ( to use an additional table for reverse look-up ), and to work around the performance iussues, for example by using additional relational tables, remove all calls to all entries at once (if not in CLI mode) and to migrate to a better database-design?

Another suggestion would be to add addtional/migration to events based plugins/code instead or additional to the Interface-Methods, e.g. something like https://github.com/frdl/event-module . You can trigger an event when calling an interface method, this can add more flexibillity, ~~
however for our this is off topic.

Ich fasse mal zusammen:
Es hatte eigentlich irgendwie schon funktioniert auf meiner Seite, aber es gab noch irgendwo diese Performance-Probleme????

We must that make equal. GUI, OID-IP, and OID-RDAP should show the same things and not 3 different APIs. What a mess
Yes there should be one API where we get the data and then transform it to the required format (RDAP/OID-IP, ...)...in a second step (data,model,view)!?

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Jan 30, 2024

Ja, stimmt, da war ja das Ding mit dem Reverse-Lookup... (Das für die Suche in der "Goto" Box gelten soll, aber dem User im "Forward"-Lookup nicht angezeigt werden sollte)

Ich versuche mal eine Lösung zu skizzieren. Lass uns mal bitte zuerst folgendes probieren: Grundidee: getAltIds() ist das, was der User sehen soll, in GUI, OID-IP, und OID-RDAP. Und getAlternativesForQuery() soll nur intern verwendet werden, für Lookups, um eine "Query" des Users zu berichtigen.

  1. GUI shows $obj->getAltIds() (= array of OIDplusAltId)
    => richtig. bleibt so
  2. OID-IP shows whoisObjectAttributes
    => richtig. bleibt so.
    => Aber ändere frdl-alt-id wieder entweder so ab, dass es getAltIds() zeigt und nicht getAlternativesForQuery().
    => Außerdem ändere saveAltIdsForQuery() [Edit: Ich hatte davor versehentlich getAlternativesForQuery geschrieben] bitte so ab, dass nur getAltIds() in die Datenbank reinkommt. Nicht WEID.
  3. OID-RDAP shows OIDplusPagePublicObjects::getAlternativesForQuery
    => Nix gut.... Ändere es bitte so ab, dass es getAltIds() zeigt und nicht getAlternativesForQuery().

Wenn wir das so machen, dann bleibt eigentlich nur noch ein einziges Problem, nämlich wie WEID den Usern in OID-IP und OID-RDAP angezeigt wird. Dafür hätte ich folgenden Lösungsansatz:
=> Im abgeleiteten OIDplusOid::getAltIds() auch WEID einbringen.
=> Optional als Schönheits-Korrektur in OIDplusPublicPageObjects::gui() hartkodiert die "weid" AltId eines "oid" Typs ausblenden, weil OIDplusOid::getTechInfo() das ja schon zeigt.

@wehowski
Copy link
Member

Außerdem ändere getAlternativesForQuery() bitte so ab, dass nur getAltIds() reinkommt. Nicht WEID.
Warum? Dann funktioniert doch das Reverse-Lookup mit WEID nicht? Dafür ist die Funktion doch???

@danielmarschall
Copy link
Collaborator Author

Ich habe es oben korrigiert. Ich meinte saveAltIdsForQuery, nicht getAlternativesForQuery

@danielmarschall
Copy link
Collaborator Author

Wenn WEID in getAltIds() reinkommt, und getAltIds() die einzige Quelle für saveAltIdsForQuery ist, dann haben wir WEID automatisch überall drin.

@wehowski
Copy link
Member

Ich versteh irgendwie das Problem grad nicht mit WEID?
In die altids Tabelle kommen

  • orig
  • alt
    Zum Looku-Up beider Spalten in beide Richtungen.
    Was geht denn kaputt wenn da WEID drin steht und man WEID wieder erst bei jedem Request "manuell" berechnen muss?

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Jan 30, 2024

Ich möchte ja, dass alles (GUI, OID-IP, OID-RDAP) ausschließlich auf getAltIds() läuft (dort ist WEID im Moment nicht drin).
Nicht mehr WEID explizit behandeln in frdl-altid-plugin.

Dann würde WEID wegfallen.

Damit es aber wieder reinkommt (damit der Benutzer es in OID-IP and OID-RDAP sehen kann), wird WEID dann in getAltIds() aufgenommen.

Ist also nur zum Anzeigen. Für Redirecten hat das glaube ich keine Auswirkungen.

Dass WEID in der DB drin steht, ist dann eher so ein Nebenprodukt, das daher kommt, dass getAltIds() verwendet wird.

@wehowski
Copy link
Member

Für meine Tabelle altids sind altids erstmal altids, da spielt es doch keine Rolle welche "Sorte" altid das ist, das dient doch dem schnelleren reverse-lookup!?
Ich bin aber auch schon etwas müde heute abend, vielleicht komme ich nicht mehr ganz so schnell mit....!?!

@danielmarschall
Copy link
Collaborator Author

Probieren wir es doch einfach mal so aus, wie ich es oben skizziert habe :-) Wie gesagt, der Inhalt der DB ist im Moment überhaupt nicht wichtig.

Du sollst nur saveAltIdsForQuery wieder so rückgängig machen, dass nur getAltIds() reinkommt und nicht den extra WEID code. Denn dieser WEID code wird dann verschoben in den OIDplus-Core unter getAltIds().

@wehowski
Copy link
Member

wehowski commented Jan 30, 2024

@danielmarschall
Copy link
Collaborator Author

Danke. Ich probiere jetzt mal bei mir was aus, und melde mich dann gleich wieder.

@danielmarschall
Copy link
Collaborator Author

danielmarschall commented Jan 31, 2024

Hallo Till,

  1. ich habe den Code leicht aufgeräumt. Bitte spiele den aktuellen Code des frdl-altid-plugins bei dir ein.

  2. In plugins/viathinksoft/objectTypes/oid/OIDplusOid.class.php Funktion getAltIds() füge bitte folgende Zeile hinzu (das kommt dann später auch in den Core)

$ids[] = new OIDplusAltId('weid', explode(':',$this->getWeidNotation(false),2)[1], _L('WEID notation'), '', 'https://weid.info');

  1. Leere bitte dann einmal deine Alt-ID Tabelle, damit wir datenbanktechnisch auf dem gleichen Stand sind.

  2. Bitte gib mir Feedback ob das jetzt alles so passt. OID-IP und GUI sollte nun beides gleich zeigen. OID-IP zeigt nun bei mir.

object:                oid:1.3.6.1.4.1.37553.8.8.2
...
alternate-identifier:  aid:D276000186B2000578CEC3DA64AEC566
alternate-identifier:  guid:605e40cf-d500-3d1b-8100-63bf368203a1
alternate-identifier:  guid:78cec3da-4720-8000-a6d3-e14f30cffefe
alternate-identifier:  guid:ffe62277-90ab-5c0c-9e23-301d02d5d499
alternate-identifier:  mac:62-CF-E4-AE-C5-66
alternate-identifier:  mac:63-CF-E4-AE-C5-66
alternate-identifier:  weid:8-2-2

In der GUI Page steht WEID nun oben und unten. Unten könnte man es ausblenden... aber andererseits, ist ja nicht so schlimm, wenn da eine zusätzliche Zeile ist. Mehr Werbung für WEID :-)

  1. Wenn das dann alles so passt, ändere bitte auch das RDAP plugin ab, sodass getAltIds() und nicht mehr getAlternativesForQuery abgefragt wird.

@wehowski
Copy link
Member

Hallo Daniel, 👍
Punkte 1 bis 4 check 👍
https://registry.frdl.de/?goto=oid:1.3.6.1.4.1.37553.8.8.2

Punkt 5: Da hab ich noch Fragen: Das RDAP mit altIds funktioniert bereits: https://registry.frdl.de/plugins/frdl/publicPages/1276945_rdap/rdap/rdap.php?query=oid%3A1.3.6.1.4.1.37553.8.8.2
Der Code ist

		$obj = OIDplusObject::findFitting($query);

		if(!$obj){
			// If object was not found, try if it is an alternative identifier of another object
			$alts = OIDplusPagePublicObjects::getAlternativesForQuery($query);
			foreach ($alts as $alt) {
				if ($obj = OIDplusObject::findFitting($alt)) {
					$query = $obj->nodeId();
					break;
				}
			}

			// Still nothing found?
			if(!$obj){
				$out['error'] = 'Not found';
				if(true === $this->useCache){
					$this->rdap_write_cache($out, $cacheFile);
				}
				return $this->rdap_out($out);
			}
		} else {
			$query = $obj->nodeId();
		}

getAlternativesForQuery ist ja für das reverse, look-up, die altIds bzw. das object haben wir ja noch nicht.
Sorry, ich stehe hier schon wieder auf dem Schlauch, muss da wirklich getAltIds() hin?
Funktionieren tut es jedenfalls!?
`

alternate-identifier  
0 "aid:D276000186B200055912E35B64AEC566"
1 "guid:5912e35b-4720-8000-a6d3-e14f30cffefe"
2 "guid:605e40cf-d500-3d1b-8100-63bf368203a1"
3 "guid:ffe62277-90ab-5c0c-9e23-301d02d5d499"
4 "mac:62-CF-E4-AE-C5-66"
5 "mac:63-CF-E4-AE-C5-66"
6 "weid:8-2-2"
7 "x500dn:/dc=com/dc=example/cn=oidplus/1.3.6.1.4.1.37476.2.5.2.9.4.1=1494410075/1.3.6.1.4.1.37476.2.5.2.9.4.2=1689175398"
parent "oid:1.3.6.1.4.1.37553.8.8 (public)"

`

@wehowski
Copy link
Member

wehowski commented Jan 31, 2024

Sorry, ich stehe hier schon wieder auf dem Schlauch, muss da wirklich getAltIds() hin? Funktionieren tut es jedenfalls!?
Die altIds() stehen schon drin, auch aus der Funktion, da sich das RDAP die Daten vom OID-IP holt:

			$oidip_generator = new OIDplusOIDIP();

			list($oidIP, $dummy_content_type) = $oidip_generator->oidipQuery($query);

?!?

@danielmarschall
Copy link
Collaborator Author

Hallo Till,
wenn da bereits die getAltIds() drinstehen, dann ist alles OK.
Ich kann RDAP bei mir wie gesagt nicht testen, weil immer der 30 Sekunden Execution Timeout kommt. Deswegen konnte ich zu RDAP kein richtiges Feedback abgeben.

@danielmarschall
Copy link
Collaborator Author

OFFTOPIC: Eine ganz andere Sache bzgl. OID-IP:
In der ganz alten Version (die noch im Core gebundelt ist) steht

canonical-identifier:  oid:1.3.6.1.4.1.37553.8.8.2
handle-identifier:     oid:1.3.6.1.4.1.37553.8.8.2

aber im neuen OID-IP nicht mehr. Ist das so gewollt?

@wehowski
Copy link
Member

wehowski commented Jan 31, 2024

Hallo Daniel,
nicht wirklich, hab handle und canonical wieder hinzugefügt, siehe: a746950

Edit: hab das nochmal korrigiert $obj->nodeId(true),

@danielmarschall
Copy link
Collaborator Author

Alles klar. Jetzt erscheint es wieder bei mir.

@danielmarschall
Copy link
Collaborator Author

Ich habe jetzt noch SQL Server hinzugefügt.
feaa9ce
Die anderen DBMS können wir ja mal als TODO lassen. Mir ist im Moment kein anderer OIDplus-Kunde bekannt, der eine anderes DBMS einsetzt.

getCanonical() ist noch unbenutzt. Kann die Funktion weg oder ist die Verwendung irgendwo versehentlich weggefallen?

Von meiner Seite aus kann diese Version des Plugins nun veröffentlicht werden.

@wehowski
Copy link
Member

getCanonical() ist noch unbenutzt. Kann die Funktion weg oder ist die Verwendung irgendwo versehentlich weggefallen?
Gut dass Du das ansprichst! Hab das nochmal hier gefixt, sollte so besser sein?
e8ed9c7

Von meiner Seite aus kann diese Version des Plugins nun veröffentlicht werden.
Ok, ich release mal 1.0.6!??

@danielmarschall
Copy link
Collaborator Author

Habe nun alle "TODOs" aus diesem Ticket in Issues #19 und #20 verschoben.

Vor dem Release von 1.0.6 könnte man vielleicht noch #18 und #19 machen, das wär noch wichtig.

@wehowski
Copy link
Member

wehowski commented Jan 31, 2024

Sorry, hab das release schon getätigt, aber beginne sofort mit dem nächsten #19 ab morgen!

Sollte in den OIDplus-Kern vielleicht noch eine Funktion rein "isCronjob()" damit die Plugins erkennen können, ob sie sich in einem Cronjob befinden? Wär ganz cool.
Intuitiv würde ich sagen nein, denn die Klasse/Funktion/Prozedur sollte so wenig wie möglich "wissen" und nur ihre Aufgabe erfüllen, für unseren Fall wäre es vielleicht OK PHP_SAPI zu prüfen ob cli oder web mode!?

EDIT: Hatte zu schnell gelesen und mich auf das Plugin bezogen, im core macht eine function isCronjob() vl. natürlich Sinn.

@danielmarschall
Copy link
Collaborator Author

(Habe den Kommentar zu Cron/SAPI in #20 hinzugefügt)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants