25A8640C720E4DB398D87A8409A679AA
  • Thomas Pollinger
  • 06.05.2019
  • DE

RQL-Befehle in benutzerdefinierten Aufträgen: Einsatzmöglichkeiten

In den vorherigen Artikeln aus dieser Serie haben wir uns mit der Funktionsweise der RQL-Commands innerhalb benutzerdefinierten Aufträgen beschäftigt. Als nächstes möchte ich jetzt mich um die Einsatz-Möglichkeiten kümmern und einige Beispiele aufzeigen. Denn mit den RQL-Commands lassen sich viele Dinge automatisieren und dann auch mit mehr Logik bzw. Abhängigkeiten.

Performance-Messung (per Seitenvorschau)

Als erstes möchte ich ein Beispiel bringen, bei dem man über die Seitenvorschau direkt zwei Dinge abklären kann. Die erste Variante ist primär für eine Art Performanze-Messung, bei der man die Seitenvorschau-Geschwindigkeit über einen Zeitraum automatisch messen lassen kann.

<IODATA loginguid="[!guid_login!]">
  <ADMINISTRATION action="validate" guid="[!guid_login!]" checkonly="1" useragent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)">
    <PROJECT guid="084D6659A806425BACA8D29F37FD231D" />
  </ADMINISTRATION>
</IODATA>
<RQLCOMMAND type="for" name="PAGES">
  <LIST>
    <IODATA loginguid="[!guid_login!]" dialoglanguageid="DEU" languagevariantid="ENU" sessionkey="[!key!]">
      <PAGE action="xsearch" maxhits="0" pagesize="10" orderby="pageid">
        <SEARCHITEMS>
          <SEARCHITEM key="contentclassguid" value="BFF4E575A1C345FCBA286518F53F00AA" operator="eq" />
        </SEARCHITEMS>
      </PAGE>
    </IODATA>
  </LIST>
  <OBJECTIVES>
    <IODATA loginguid="[!guid_login!]" sessionkey="[!key!]">
      <REDDOT mode="" userlevel="1" translationmode="0" linkfromguid="" projectguid="[!guid_project!]" loginguid="[!guid_login!]" url="/cms/ioRD.asp" querystring="Action=RedDot&amp;Mode=1&amp;PageGuid=[!guid_page!]" />
    </IODATA>
  </OBJECTIVES>
</RQLCOMMAND>

Bei diesem Aufrag, werden auf Basis einer Content-Klasse 10 Seiten gesucht und dann über jede Seite eine Vorschau durchgeführt. Das Ergebnis findet man dann im Log-Dateiordner Reports. Dort lässt sich dann an Hand des Erstellungsdatums und dem letzten Änderungsdatum die benötigte Zeit ermitteln. Wenn man dies über einen längeren Zeitraum regelmäßig durchführt und auswertet, bekommt man ein gutes Gefühl über die Performanze bei der Seiten-Vorschau bzw. der Publizierung. ;)
 

Regressionstest (per Seitenvorschau)

Mit dem zweiten Beispiel möchte ich eine Möglichkeit für einen Regressionstest aufzeigen. Das Prinzip ist recht einfach ;) Man sucht zuvor aufwählte und markierte Seiten per Schlagwortsuche. Dann führt man wieder eine Seitenvorschau aus und vergleicht das Ergebnis der Log-Dateien auf Veränderungen.

<IODATA loginguid="[!guid_login!]">
  <ADMINISTRATION action="validate" guid="[!guid_login!]" checkonly="1" useragent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)">
    <PROJECT guid="084D6659A806425BACA8D29F37FD231D" />
  </ADMINISTRATION>
</IODATA>
<RQLCOMMAND type="for" name="PAGES">
  <LIST>
    <IODATA loginguid="[!guid_login!]" dialoglanguageid="DEU" languagevariantid="ENU" sessionkey="[!key!]">
      <PAGE action="xsearch" maxhits="0" pagesize="10" orderby="pageid">
        <SEARCHITEMS>
          <SEARCHITEM key="keyword" value="56A7545A1C345FCBA286518F53F11BC" operator="eq" />
        </SEARCHITEMS>
      </PAGE>
    </IODATA>
  </LIST>
  <OBJECTIVES>
    <IODATA loginguid="[!guid_login!]" sessionkey="[!key!]">
      <REDDOT mode="" userlevel="1" translationmode="0" linkfromguid="" projectguid="[!guid_project!]" loginguid="[!guid_login!]" url="/cms/ioRD.asp" querystring="Action=RedDot&amp;Mode=1&amp;PageGuid=[!guid_page!]" />
    </IODATA>
  </OBJECTIVES>
</RQLCOMMAND>

Auch hier ist wieder wichtig, dass man das Ergebnis der Suche immer in der gleichen Reihenfolge abarbeitet. Damit man später per Dateivergleich die beiden Log-Dateien auf Veränderungen prüfen kann.
 

Suchergebnis-Export

Das nächste Beispiel ist eine gute Möglichkeit um Suchergebnisse zu exportieren. Vor allem wenn diese später weiterverarbeiten möchte ;) Das können z.B. wieder verschlagwortete Seite oder andere Suchparameter sein.

<IODATA loginguid="[!guid_login!]">
  <ADMINISTRATION action="validate" guid="[!guid_login!]" checkonly="1" useragent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)">
    <PROJECT guid="084D6659A806425BACA8D29F37FD231D" />
  </ADMINISTRATION>
</IODATA>
<RQLCOMMAND type="for" name="PAGES">
  <LIST>
    <IODATA loginguid="[!guid_login!]" dialoglanguageid="DEU" languagevariantid="ENU" sessionkey="[!key!]">
      <PAGE action="xsearch" maxhits="0" pagesize="10" orderby="pageid">
        <SEARCHITEMS>
          <SEARCHITEM key="keyword" value="56A7545A1C345FCBA286518F53F11BC" operator="eq" />
        </SEARCHITEMS>
      </PAGE>
    </IODATA>
  </LIST>
  <OBJECTIVES>
  </OBJECTIVES>
</RQLCOMMAND>

Als Ergebnis bekommt man ein XML innerhalb der Log-Datei unter /Reports/. Wenn man dann dort den Knoten <IODATA><PAGES>...:

<IODATA>
    <PAGES searchguid="06885382E6794F67A1130E4DAF6FE860" 
        hits="16646" 
        page="1" 
        pagesize="10" 
        maxhits="0" 
        tasklist="" 
        projectguid="072D6659A806425BACA8D29F37FD6E7D" 
        timer1="0,39068430000043" 
        timer2="1,23436479999873" 
        orderby="pageid" 
        orderdirection="ASC" 
        groupby="" 
        groupdirection="">
        <PAGE guid="D0623413CC2F4CFD8B165E7579805547" 
            id="166228" 
            headline="Homepage" 
            flags="524288" 
            mainlink="7D6743E3AAE840409581B7AE0618D6CD" 
            status="1" 
            hidebuttonflags="1" 
            stateguid="CF3B2682D7A449018207891C93399650">
        </PAGE>
        ...
    </PAGES>
</IODATA>

auswertet. Ist man in der Lage diese Daten sehr einfach und schnell an anderer Stelle wieder zu verwenden. Gerade wenn man schnell und einfach die GUIDs oder andere Daten benötigt. Dafür bieten sich dann z.B. PowerShell-Skripte an, welche mit XML sehr gut umgehen können. ;)
 

Aufräum-Skripte für alle Projekte (OotB)

Es gibt aber auch in der Online-Hilfe noch ein schönes und hilfreiches Beispiel für ein Aufräum-Skript im Zusammenspiel mit dem Deliver-Server:

<RQLCOMMAND type="for" 
    name="PROJECTS">
    <LIST>
        <IODATA loginguid="[!guid_login!]">
            <ADMINISTRATION>
                <USER guid="[!guid_user!]">
                    <PROJECTS action="list" 
                        extendedinfo="1"/>
                </USER>
            </ADMINISTRATION>
        </IODATA>
    </LIST>
    <OBJECTIVES>
        <RQLCOMMAND type="if">
            <WHERE name="testproject" 
                value="0" 
                operator="="/>
            <OBJECTIVES>
                <RQLCOMMAND type="if">
                    <WHERE name="inhibitlevel" 
                        value="0" 
                        operator="="/>
                    <WHERE name="inhibitlevel" 
                        value="1" 
                        operator="="/>
                    <WHERE name="inhibitlevel" 
                        value="2" 
                        operator="="/>
                    <WHERE name="inhibitlevel" 
                        value="3" 
                        operator="="/>
                    <WHERE name="inhibitlevel" 
                        value="4" 
                        operator="="/>
                    <WHERE name="inhibitlevel" 
                        value="5" 
                        operator="="/>
                    <OBJECTIVES>
                        <RQLCOMMAND type="if">
                            <WHERE name="lockedbysystem" 
                                value="0" 
                                operator="="/>
                            <OBJECTIVES>
                                <IODATA loginguid="[!guid_login!]">
                                    <ADMINISTRATION action="validate" 
                                        guid="[!guid_login!]" 
                                        useragent="script">
                                        <PROJECT guid="[!guid_project!]"/>
                                    </ADMINISTRATION>
                                </IODATA>
                                <RQLCOMMAND type="for" 
                                    name="PROJECTVARIANTS">
                                    <LIST>
                                        <IODATA sessionkey="[!key!]" 
                                            loginguid="[!guid_login!]">
                                            <PROJECT>
                                                <PROJECTVARIANTS action="list" />
                                            </PROJECT>
                                        </IODATA>
                                    </LIST>
                                    <OBJECTIVES>
                                        <RQLCOMMAND type="for" 
                                            name="LANGUAGEVARIANTS">
                                            <LIST>
                                                <IODATA loginguid="[!guid_login!]" 
                                                    sessionkey="[!key!]">
                                                    <PROJECT>
                                                        <PROJECTVARIANTS action="load">
                                                            <PROJECTVARIANT guid="[!guid_projectvariant!]"/>
                                                        </PROJECTVARIANTS>
                                                    </PROJECT>
                                                </IODATA>
                                            </LIST>
                                            <OBJECTIVES>
                                                <RQLCOMMAND type="if">
                                                    <WHERE name="cleanuplive server" 
                                                        value="1" 
                                                        operator="="/>
                                                    <OBJECTIVES>
                                                        <IODATA loginguid="[!guid_login!]" 
                                                            sessionkey="[!key!]">
                                                            <PROJECT>
                                                                <CLEANER action="delete" 
                                                                    projectvariantguid="[!guid_projectvariant!]" 
                                                                    languagevariantguid="[!guid_languagevariant!]">
                                                                    <EMAIL subject="[!mail_subject!]" 
                                                                        userguid="[!guid_recipient!]"><![CDATA[Optional können Sie hier einen Text für die E-Mail einfügen.]]></EMAIL>
                                                                </CLEANER>
                                                            </PROJECT>
                                                        </IODATA>
                                                    </OBJECTIVES>
                                                </RQLCOMMAND>
                                            </OBJECTIVES>
                                        </RQLCOMMAND>
                                    </OBJECTIVES>
                                </RQLCOMMAND>
                            </OBJECTIVES>
                        </RQLCOMMAND>
                    </OBJECTIVES>
                </RQLCOMMAND>
            </OBJECTIVES>
        </RQLCOMMAND>
    </OBJECTIVES>
</RQLCOMMAND>

Eine ausführliche Erläuterung gibt es dazu in der Online-Hilfe, im Handbuch SmartTree, im Kapitel 5.2.4.1 Befehl CLEANER einrichten. ;)

Es gibt auch noch ein zweites Beispiel, welches ebenfalls in dieser Artikelserie verwendet wurde, zum bereinigen der Publizierungsberichte in den Projekten:

<RQLCOMMAND type="for" 
    name="PROJECTS">
    <!-- Deletes publication job reports from the database (IO_EXR) and 
    publication log files from the Management Server instance this job runs on.  -->
    <!-- List all projects to apply the OBJECTIVES commands to them. -->
    <LIST>
        <IODATA loginguid="[!guid_login!]" 
            sessionkey="[!guid_login!]">
            <ADMINISTRATION>
                <USER guid="[!guid_user!]">
                    <PROJECTS action="list" 
                        extendedinfo="1" />
                </USER>
            </ADMINISTRATION>
        </IODATA>
    </LIST>
    <!-- The commands in the OBJECTIVES element are executed for all result elements of the LIST element -->
    <OBJECTIVES>
        <!-- Connect to the current project -->
        <IODATA loginguid="[!guid_login!]">
            <ADMINISTRATION action="validate" 
                guid="[!guid_login!]">
                <PROJECT guid="[!guid_project!]" />
            </ADMINISTRATION>
        </IODATA>
        <!-- Remove the publishing reports and and logfiles for the current project if they are older than seven days (days="7") -->
        <IODATA loginguid="[!guid_login!]" 
            sessionkey="[!guid_login!]">
            <PROJECT guid="[!guid_project!]" 
                sessionkey="[!guid_login!]">
                <EXPORTREPORT days="7" 
                    action="deleteall" 
                    deletelogfiles="1" />
            </PROJECT>
        </IODATA>
    </OBJECTIVES>
</RQLCOMMAND>

Diesen mitgelieferten benutzerdefinierten Auftrag findet man bei jeder Installation (OotB) immer Server-Manager wieder. Falls dieser nicht verfügbar sein sollte, liegt es evtl. daran, dass es sich um eine ältere und oft upgedatetete Installation handelt. Dann einfach den o.g. benutzerdefinierten Auftrag einrichten und in der Online-Hilfe im Handbuch Server Manager nachlesen. ;)


Fazit

Die den Benutzerdefinierten Aufträgen lassen sich sehr viele Dinge verarbeiten und automatisieren. Wenn man jetzt noch diese Aufträge mit den RQL-Commands verfeinert und gezielter arbeiten lässt, ist das ein mächtiges Werkzug. Vor allem automatische Tests, Datenexporte, Inhaltesuchen bis hin zu Updates von Inhalten ist alles möglich. Immer im Kontext des hinterlegten Benutzerkontos und mit Blick auf die Rechte des Kontos im jeweiligen Projekt.

Die einzige Voraussetzung welche man mitbringen sollte ist, dass man sich mit der Arbeitsweise der RQLs etwas auskennt und wie man diese anwendet. Die RQL-Commands übernehmen, in Kombination mit den benutzerdefinierten Aufträgen, dann den Rest ;)

Bis dahin, viel Spaß beim testen ;)


Über den Autor:
Thomas Pollinger

... ist Senior Site Reliability Engineer bei der Vodafone GmbH in Düsseldorf. Seit dem Jahr 2007 betreut er zusammen mit seinen Kollegen die OpenText- (vormals RedDot-) Plattform Web Site Management für die deutsche Konzernzentrale.

Er entwickelt Erweiterungen in Form von Plug-Ins und PowerShell Skripten. Seit den Anfängen in 2001 (RedDot CMS 4.0) kennt er sich speziell mit der Arbeitweise und den Funktionen des Management Server aus.