Beiträge von RockWilder

    Ich frage mich, wie die restlichen Header des Verbindungsaufbaus aussehen.
    Wenn nämlich der Client ein EHLO an den remote Mailserver sendet mit dem FQHN des Servers, dann ist es gut möglich, dass das nicht tut: der remote Mailserver weist den Verbindungsaufbau hoffentlich ab, weil er so konfiguriert ist, dass er keine Verbindungen annimmt von Gegenstellen, die sich mit fremden Namen melden.

    //edit:
    da kam ich leicht zu spät, ein paar der folgenden Fragen hast du gerade beantwortet


    Wie sieht der notes://-Link im Detail aus?
    notes://servername/replica-id/view-id/doc-id oder notes://vollqualifizierter.host.name/replica-id/view-id/doc-id


    Auch möglich, dass zwar euer DNS tut ("neuerhost.name" wird aufgelöst), aber NetBIOS nicht (richtig), weswegen dann "neuerhost" (noch) nicht aufgelöst wird.


    Die server decommission sollte eigentlich nur der allerletzte Ausweg sein. Normal baut man auch kein neues Haus, wenn man das alte einfach neu anstreichen könnte ;)
    Damit sollte es dann zwar auf jeden Fall tun, ist allerdings auch nicht unbedingt in 5 Minuten erledigt und kann natürlich auch noch andere Nigglichkeiten nach sich ziehen......


    Kannst du sowohl
    - NeuerServer/Org
    - NeuerServer
    - neuerhost.name
    - neuerhost
    fehlerfrei vom Client aus tracen? Was exakt sagt die client-eigene Namensauflösung?
    Für die letzteren beiden Fälle: versuch das Selbe mal in einer DOS-Box => was passiert?


    Was passiert, wenn du den notes://-Link in die Adresszeile des Client wirfst?
    Was exakt siehst du auf dem Server (ggf. Loglevel hochdrehen), und (nur für alle Fälle) kannst du den Netzwerkverkehr mitschneiden?

    Wie soll das denn funktionieren? Wenn du jemandem nach den Weg fragst und er antwortet dir, dass du gleichzeitig nach links und nach rechts gehen sollst, um wievieles schlauer bist du dann?


    Ihr habt nun mehrere Möglichkeiten:
    - ihr bekommt eure Verbindungsdokumente auf die Reihe. Und das bedeutet auch, dass ihr euch sämtliche Felder anschaut und ggf. bereinigt. Alle. Ausnahmslos.
    - ihr setzt einen zweiten Server auf, der alte behält den alten FQDN, der neue läuft unter dem neuen. Dann lest ihr euch in der Hilfe durch, wie man einen Server decommissioned.
    - ihr bekommt eure Namensauflösung und ggf. das Routing im Netzwerk auf die Reihe.

    Was meinst du mit "über -> (neuer|alter) Hostname"? Meinst du damit Passthru-Verbindungsdokumente? Wenn ja: mach direkte Verbindungsdokumente draus:
    - neuerNotesSrv/Org => 192.168.0.1
    - alterNotesSrv/Org => 192.168.0.1


    Weiters werden Verbindungsinformationen, insbesondere die IP/der DNS-Name vom Client in versteckten Feldern gecachet. Wenn ihr das alte Verbindungsdokument einfach nur umgeschrieben habt, schau dir die Felder mal an. Am einfachsten machst du einfach komplett neue.


    Habt ihr das alte Serverdokument im DD gelöscht, oder existiert es noch (solange die Transition läuft)?
    Wenn der alte Server parallel zum Neuen noch mitläuft: habt ihr die geclustert und haben sich die Clusterinformationen zu den Clients durchgefressen?

    Kann es sein, dass das Prinzip nicht so ganz verstanden wurde?
    Eine user-defined Page auszuliefern kann per definitionem keinen 404 zurück liefern, eben da etwas ausgeliefert wird. Wenn dein Briefträger dir sagt, dass er heute nichts für dich dabei hat und völlig zusammenhanglos irgendetwas anderes einwirft, was er gerade für richtig und passend hält, wärst du bestimmt nur begrenzt begeistert.


    Ich empfehle dringend, sich mit den Konzepten der HTTP-Statuscodes sinnentnehmend auseinander zu setzen und die eigene Infrastruktur darauf zu trimmen, als irgendetwas Krudes zusammen zu basteln, was so überhaupt rein gar nichts mit den RFCs zu tun hat. Wenn euer Webserver etwas ausliefern soll, kann und darf kein 404 zurück kommen. Und wenn es einen 404 geben soll, konfiguriert euer System halt so, dass es nicht alles annimmt. Oder alternativ richtet entsprechende Redirects/Rewrites ein, wenn möglichst viele Optionen behandelt werden sollen


    Wer meint, dennoch seinen eigenen Kopf durchsetzen und jahrzehntelange gelebte und erprobte Praxis verbasteln zu müssen, der darf gern einen eigenen RFC einreichen, der das Szenario behandelt. Dann wird sich zeigen, was der Rest der Welt davon hält. :thumbdown: Der einzige, der an jedweden allgemeingültigen Standards vorbei eigenen Ramsch als Maß der Dinge definieren darf, ist Mickischrott und sogar die haben schon einsehen müssen, was sie davon haben: den Hohn und den Spott haben sie sich jedes Mal aufs Neue redlich verdient (muss man auch erstmal können).

    Da ließen sich schon Lösungen bauen:
    - wenn der Inhalt von Feld1 aus Doc1 @Matches Feld2 aus Doc2 (ggf. Regexp draus bauen), setze Flag in Doc2 (bspw. die UUID von Doc1), anschließend eine temporäre View, die nach dem Flag kategorisiert ist
    => sieht dann so aus:
    |> UUID: 4711
    - Doc5
    - Doc6
    - Doc12
    |> UUID: 0815
    - Doc3
    - Doc11
    - DocPiUndDrölfzich


    Dann hast du einen ungefähren Überblick, was Pi mal Daumen als ähnlich angesehen wird. Ist zwar immernoch eine Heidenarbeit, das Doc für Doc auseinander zu klamüsern, aber immerhin ein Ansatz.
    Der eklatante Nachteil ist natürlich, dass du
    a) das für alle Dokumente über alle Dokumente laufen lassen musst (10k x 10k). Aber das macht nix, kann nachts laufen
    b) alle Docs angepackt werden, was zum Einen die Docs selbst verändert (ist mglw. nicht gewünscht) und zum Anderen einen großen Replizieraufwand nach sich zieht. Das selbe hinterher, wenn du nach der Bereinigung die Flags wieder rausnimmst.


    Aber wie man es auch drehen und wenden mag und wie auch immer eine elegantere Lösung aussehen mag: zum Einen hat der Server erstmal genug zu tun, zum Anderen muss dann der Fachverantwortliche am Ende doch jedes Doc auf sachliche Richtigkeit kontrollieren. Kommt halt davon, wenn man bei der Datenerfassung und -pflege schlampig arbeitet, da muss er durch.

    Vom Löschen habe ich auch nichts gesagt ;)
    Hast du dir mal die @Like- und @Matches- Operatoren angeschaut? Die können in gewissen Grenzen Regexp ... zwar nicht ganz so, wie man es von den meisten Tools auf unixoiden Systemen gewohnt ist, aber für den geschilderten Einsatzbereich sollte das (vorerst) ausreichen.

    Bei allem Respekt: den Ansatz als solchen halte ich schon für falsch. Egal wie und was du programmierst: der Code kann nicht entscheiden, was ein Dublette ist und was wirklich so gewollt ist. Woher soll der Code wissen, dass "Volker22" und "Volker21" entweder zwei verschiedene Personen sind oder die selbe mit Typo? Woher soll der Code wissen, ob (hier bei uns) die "Dudweiler Straße" und die "Dudweiler Landstraße" wirklich an zwei Ecken der Stadt liegen, oder ob eins davon eine Falscheingabe war? Und wenn dein Code das wissen sollte: kannst du unserem Pizzaheini Bescheid sagen? Der hat damit so seine Problemchen und wir warten jeden zweiten oder dritten Mittwoch auf unsere Nervennahrung. ;)


    Wer auch immmer Unsinn in die Datenbasis eingetragen hat, soll sie auch wieder fixen. Alles andere ist bestenfalls Augenwischerei, im schlimmsten Fall werden korrekte Daten "korrigiert" und hinterher ist das Geschrei groß.


    Auch wenn ich ein großer Freund davon bin, die Blödmannsgehilfentätigkeiten dem Computer zu überlassen: aber solange wir keine anständige KI haben, sollte lieber eine richtige I drangehen und noch warten, bis das K auch was taugt.

    Eine "Notes Tabelle" an sich gibt es nicht. Es gibt Dokumente und es gibt Items. Du willst also offenbar den Content eines Dokumentes migrieren.
    Weiters willst du nicht nach Sharepoint migrieren, da Sharepoint an und für sich ein hummelbrunzdoofes Ding ist ohne nennenswerte eigene Funktionalität. Die Funktionalität wird durch einen Webserver und einen Datenbankserver zur Verfügung gestellt.


    Um jetzt deine Anfrage technisch korrekt auszudrücken: du willst den Content von Items aus Notesdokumenten heraus in eine relationale Datenbank migrieren. Dafür gibt es ODBC und Konsorten oder (built-in) DECS.

    Hat es auf dem Server genug Platz? Insbesondere auf dem Medium, wo ihr die Indizes erstellt.
    Hat es vllt. noch einen übrig gebliebenen Index, bzw. dessen Verzeichnis(se), die -warum auch immer- nicht gelöscht wurden?
    Was hast du bereits an DB-Wartungsarbeiten vorgenommen?
    Funktioniert mit der User.ID die Indexerstellung auf anderen Datenbanken, bzw. anderen Servern?

    Für Windoof kann ich nicht sprechen. Aber ich vermute mal, ihr habt die Zertifikate ohnehin in einer weniger obskuren Umgebung erstellt? Dann könnt ihr dort auch die key rings verwalten


    openssl rsa -in dein_root_cert.pem -out new_cert_for_apache.key
    openssl x509 -in new_cert_for_apache.csr -out new_cert_for_apache.cert -req -signkey new_cert_for_apache.key [ -days NNN ]
    cp new_cert_for_apache.cert /etc/ssl/certs/server.crt
    cp new_cert_for_apache.key /etc/ssl/private/server.key


    ... oder wo auch immer Apache unter Windoof seine Certs erwartet....


    Google findet neben zig-tausenden anderen Seiten bspw. das hier

    Danke für den Tipp mit der TeamMailbox, zu dem Bearbeiter finde ich hier auf die Schnelle nichts, aber ich werde es mir mal detaillierter ansehen.

    Mein Fehler! Das, was ich noch "in Erinnerung" hatte, war das, was ich seinerzeit selbst drangebastelt hab *grmpf* :S
    Das war im Grunde aber auch denkbar trivial: in die Inbox eine neue (erste) Spalte eingefügt, nach dem Feld "Bearbeiter" kategorisiert und zudem noch einen Button mit einer "Simple Action", das den Bearbeiter setzt. Im einfachsten Fall:

    Code
    @SetField("Bearbeiter"; @Name[CN]; @Username)


    Ich hatte es so gelöst, dass ich ein weiteres Profildokument erzeugt habe, in dem alle infrage kommenden Bearbeiter enthalten sind, der Button in der Inbox liest das Profildokument aus, öffnet mittels einen Prompt, aus dem man den Bearbeiter auswählen oder zurücksetzen kann.
    Kurz angerissen, nicht funktionsfähig:

    Code
    Set notesDocument=notesDatabase.GetProfileDocument("bearbeiterprofil")
    valueArray=notesDocument.GetItemValue("alle_bearbeiter")
    variant=notesUIWorkspace.Prompt( 4, "titel","prompt", valueArray(0), valueArray )
    caretNoteID$=notesUIView.CaretNoteID
    Set notesDocument=notesDatabase.GetDocumentByID(caretNoteID$)
    Set notesItem=notesDocument.ReplaceItemValue("bearbeiter", variant(0))


    Bei mir war der default value dann der Name der aktuellen ID und das ganze hat noch kein error handling (Was passiert, wenn "Cancel" gedrückt wird? Was passiert, wenn das Profildokument nicht vorhanden oder nicht lesbar ist? Darf Lieschen Müller überhaupt Detlef Dau als Bearbeiter einsetzen? Wer darf sich von welchen Vorgängen selbst runternehmen? ....). Ich denke, du bekommst so schon einen Überblick, wie das lösbar wäre.


    Wenn man will (oder es für interne Prozesse benötigt), lassen sich Workflows einbauen. Zum Beispiel: du hast seit X Tagen einen Vorgang, der immernoch im Status "offen" oder "in Bearbeitung" steht, also geht eine Mail an deinen Chef oder den Produktverantwortlichen oder wen auch immer. Oder : das Ticketsystem schickt Benachrichtigungsmails an diese Mail-In und anhand der Subjects lässt sich automatisiert eine Zuweisung vornehmen. Beispiel: alles was mit User.IDs und vergessenen Passwörtern zu tun hat, geht an Lieschen Müller, alles was mit ACLs/Zugriffen zu tun hat, geht an Detlef Dau, ... und das auch nur, wenn Lieschen oder Detlef nicht gerade "Urlaub" (o.ä.) in ihrem Kalender vermerkt haben; in dem Falle soll es einem benannten Stellvertreter übergeholfen werden.


    Vermutlich führt das jetzt aber ein Stück zu weit. Versuch erstmal mit den Code Fragmenten oben zu realisieren, was dir vorschwebt.

    Zunächst einmal willkommen im Forum! :thumbup:


    Das Vorhaben an sich ist im Grunde relativ schnell realisiert. Man muss nur wissen, was man sucht und wo. Das "Wo" ist schnell erklärt: F1. Das "Wie" ist kaum schwieriger:
    - Setzen eines Feldes: @SetField
    - Nutzername: @UserName, geeignet kombiniert mit @Name
    - Mail versenden: @Compose


    Die Frage ist aber, ob es rein grundsätzlich wirklich Sinn macht, was du vorhast. Mail-In Datenbanken sind ja eigentlich u.a. dafür da, dass man "anonym" kommunizieren kann. Soll heißen: es meldet sich eben nicht mehr Lieschen Müller beim Kunden, sondern halt nur "support@firma.de" oder so. Weiters kann das Probleme geben, wenn Abwesenheiten nicht entsprechend berücksichtigt werden: Ist ja schön, wenn Lieschen Müller einen Vorgang übernimmt und ihn sich zuweist. Blöd nur, wenn Lissie morgen krank ist und niemand kümmert sich um den Vorgang und ggf. entsprechende Mails, die seitens der Kunden zurückkommen. Das ist aber ein technisches, sondern eher ein organisatorisches Problem. Dennoch muss es berücksichtigt werden.
    Überhaupt: was hast du dir vorgenommen, wie Follow-Ups berücksichtigt werden? Wie werden neue Mails, die sich auf einen bestehenden Vorgang beziehen, "einsortiert", sprich: Lissie zugeordnet? Was passiert, wenn sich Lissie einen Vorgang zuordnet, sich dabei aber verklickt hast und als Bearbeiter wieder rausnimmt, um sich woanders einzutragen? Gibt es dann eine entsprechende Mail an den Kunden: "April, April, es Lissie hat sich verklickt, versuchs nochmal"? Alternativ kannst du natürlich einen Agenten stricken, der nur stündlich oder von mir aus nur einmal täglich über die Dokumente drüberläuft und dann und nur dann eine entsprechende Mail rausschickt, wenn das Dokument neu ist seit dem letzten Lauf (Hint: UnprocessedDocuments).


    Die Idee, die du da hast, ist nicht grundverkehrt. Allerdings müssen da noch ein paar Dinge am Rande berücksichtigt und in Angriff genommen werden und an der einen oder anderen Stelle wird man dann merken, dass das eben nicht "mal eben so" zu realisieren ist. Jedenfalls nicht DAU-proof... Und ob das eine oder andere Detail im Workflow so in der Form wirklich Sinn ergibt, auch das wäre noch zu diskutieren.
    Hast du in dem Zusammenhang die TeamMailbox mal getestet? In dem Template sind Auto-Responder und IIRC Bearbeiter ohnehin schon realisiert. Das ist zwar AFAIK noch das alte 6er-basierte Template, aber zum einen kann man sich ja Anregungen holen und vllt. zum anderen das eine oder andere aufs 9er Template portieren?

    Was passiert, wenn du "k" und "o" nicht nur als Double definierst, sondern auch gleich noch mit "0" initialisierst?
    Was passiert weiters, wenn du "sum" nicht nur initialisierst, sondern auch explizit den Typen (bspw. "Double") setzt?
    Was sagt der Debugger an den Stellen
    - k = sum
    - o = sum
    - d = k - o (wo hast du "d" definiert?)
    zu den Werten und Typen?




    Was sagen die Feldeigenschaften an der Stelle "Call uidoc.FieldSetText("diff",Cstr(d))" für "diff"?


    Einer Variable nur den Typ, aber keinen Initialwert mitzugeben, kann -je nach Sprache und Betriebssystem- zu Problemen führen. Nicht zwangsläufig ist dann "0" (die Zahl Null) der default value. Das Problem hierbei ist der jeweilige Compiler oder Interpreter, der das u.U. nicht sauber verwaltet.
    Wird eine neue Variable instantiiert, wird -grob ausgedrückt- ein neuer Pointer auf den Stack geschoben. Der Pointer (wie der Name sagt) selbst hat keinen Value, sondern zeigt auf eine Speicheradresse. Mit Speicheradresse verhält es sich im Grunde (und wieder nur grob ausgedrückt), wie mit Dateisystemen: löscht man eine Datei, ist sie noch lange nicht weg, sondern nur der Block und ggf. alle Folgeblöcke werden als zum erneuten Gebraucht verwendbar bezeichnet. Das Bitmuster innerhalb der Blöcke bleibt allerdings erhalten, deswegen lassen sich gelöschte Dateien i.d.R. auch mit überschaubarem Aufwand recovern. Das Gleiche gilt für Speicheradressen: die Adresse selbst kann durchaus als zum erneuten Gebrauch freigegeben sein, allerdings befindet sich da ja mglw. noch etwas. Wenn jetzt der Compiler oder der Interpreter nicht aufpasst, wird der neue Zeiger plötzlich auf den Speicherinhalt "4711" zeigen (anstatt auf gähnende Leere) und die so instanziierte Variable wird implizit initialisiert.
    Es gibt allerdings eine Reihe von Mechanismen bei Windows und den Unixoiden, die genau das verhindern sollen. Vorrangig geht es dabei allerdings um SIcherheitsaspekte: wenn ein freigegebener Speicherbereich genullt wird, kann kein Schadprogramm der Welt durch Auslesen des Speichers an irgendwelche Informationen kommen. Vergleichbar mit bestimmten Löschprogrammen, die die Datei im Dateisystem nicht nur löschen, sondern mehrfach mit Nullen oder Zufallswerten überschreiben. Allerdings hat die Vergangenheit mehrfach gezeigt, dass beide Mechanismen nicht 100% zuverlässig vor ebensolchen Attacken oder Bugs schützen.


    Jetzt gibt es noch die Komiker, die meinen die Probleme der impliziten Variablenzuweisung damit lösen zu müssen, dass sie im Compiler oder Interpreter dahergehen und sowas spaßiges wie ($RANDOMVALUE/2^32) zum Default ernennen. Das könnte ganz dediziert die Erklärung für die augenscheinlich nicht erklärbare Differenz von 1.8E-12 sein.
    Da du zweimal mit Doubles arbeitest, einmal "sum" nur implizit instanziierst (wird IIRC erstmal ein INT und dann, wenn der Interpreter merkt, dass du plötzlich mit Doubles kommst, wird der INT auf Double gecastet) und dann auch nicht auf einen String castest, den du ins Dokument schreibst, sehe ich da durchaus eine Menge Potential für Vorbelegungsfehler (ohne dass ich den Entwicklern bei IBM zu nahe treten möchte).