<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<?asciidoc-toc?>
<?asciidoc-numbered?>

<article lang="de">
<articleinfo>
    <title>opsi -script Local Functions</title>
    <author>
        <firstname>uib</firstname>
        <surname>gmbh</surname>
        <email>info@uib.de</email>
    </author>
    <authorinitials>UG</authorinitials>
</articleinfo>
<section id="_opsiscript_local_functions">
<title>opsiscript Local Functions</title>
<informalfigure>
<mediaobject>
  <imageobject>
  <imagedata fileref="opsi_logo.png"/>
  </imageobject>
  <textobject><phrase>opsi_logo.png</phrase></textobject>
</mediaobject>
</informalfigure>
</section>
<section id="_was_ist_das_problem">
<title>Was ist das Problem</title>
<simpara>Wiederverwendbarkeit von Code wird beschränkt durch:</simpara>
<itemizedlist>
<listitem>
<simpara>
Globale Variablen
</simpara>
</listitem>
<listitem>
<simpara>
Räumliche Trennung von Aufruf und Deklarartion von Sektionen
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-script-conf2018-advscript-local-functions-description">
<title>Vorstellung: Local Functions in opsi-script</title>
<simpara>Seit Version 4.12 kennt opsi-script auch lokale Funktionen.</simpara>
<simpara>Ein Beispiel:</simpara>
<programlisting language="winst" linenumbering="unnumbered">DefFunc myFunc(val $str1$ : string, $str2$ : string) : string
        set $result$ = $str1$ + $str2$
endfunc</programlisting>
</section>
<section id="opsi-winst-commands-localfunctions-concept">
<title>Konzept</title>
<simpara>Ziel  dieser Erweiterung ist die Umsetzung folgender Konzepte:</simpara>
<itemizedlist>
<listitem>
<simpara>
Funktionen mit Rückgabewert
</simpara>
</listitem>
<listitem>
<simpara>
Frei definierbare Aufrufparameter
</simpara>
</listitem>
<listitem>
<simpara>
Lokale Variablen
</simpara>
</listitem>
<listitem>
<simpara>
Geschachtelte Funktionen
</simpara>
</listitem>
<listitem>
<simpara>
Rekursive Aufrufe
</simpara>
</listitem>
<listitem>
<simpara>
Primäre und sekundäre Sektionen innerhalb von Funktionen
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_funktionen_mit_rückgabewert">
<title>Funktionen mit Rückgabewert:</title>
<simpara>Die Funktionen haben einen Rückgabewert<?asciidoc-br?>
welcher vom Typ <literal>string</literal> oder <literal>stringlist</literal> ist.</simpara>
<simpara>Der Aufruf eine solchen Funktion kann überall da Erfolgen,<?asciidoc-br?>
wo ein Stringausdruck bzw.eine Stringliste erwartet wird.</simpara>
</section>
<section id="_frei_definierbare_aufrufparameter">
<title>Frei definierbare Aufrufparameter:</title>
<simpara>Einer Funktion können Parameter übergeben werden.<?asciidoc-br?></simpara>
<itemizedlist>
<listitem>
<simpara>
Diese Parameter werden bei der Deklaration der Funktion definiert.<?asciidoc-br?>
<literal>DefFunc myFunc(val $str1$ : string, ref $list$ : stringlist) : string</literal>
</simpara>
</listitem>
<listitem>
<simpara>
Die Aufrufparameter können vom Typ <literal>string</literal> oder <literal>stringlist</literal> sein.<?asciidoc-br?>
</simpara>
</listitem>
<listitem>
<simpara>
Die Aufrufparameter stehen innerhalb der Funktion als lokale Variablen zur Verfügung.<?asciidoc-br?>
</simpara>
</listitem>
<listitem>
<simpara>
Die Aufrufparameter können als <emphasis>CallByValue</emphasis> oder per <emphasis>callByReference</emphasis> übergeben werden.<?asciidoc-br?>
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_callbyvalue">
<title>CallByValue:</title>
<simpara><emphasis>CallByValue</emphasis> ist der Default.<?asciidoc-br?></simpara>
<itemizedlist>
<listitem>
<simpara>
Das bedeutet: wird keine Aufrufmethode explizit angegeben, so wird <emphasis>CallByValue</emphasis> verwendet.<?asciidoc-br?>
</simpara>
</listitem>
<listitem>
<simpara>
Soll <emphasis>CallByValue</emphasis> explizit angegen werden, so erfolgt dies über das Schlüsselwort <literal>val</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>CallByValue</emphasis> bedeutet, das beim Aufruf der Inhalt einer beim Aufruf verwendeten Variable auf die Aufrufvariable kopiert wird.<?asciidoc-br?>
Es wird also der <emphasis role="strong">Wert</emphasis> übergeben
</simpara>
</listitem>
<listitem>
<simpara>
Ein <emphasis>CallByValue</emphasis> Parameter kann mit einer Variable, Konstanten oder Funktion aufgerufen werden.
</simpara>
</listitem>
<listitem>
<simpara>
Ein Variable welche zum Aufruf verwendet wird, kann durch die Funktion nicht geändert werden
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_callbyreference">
<title>CallByReference:</title>
<simpara><emphasis>CallByReference</emphasis> ist <emphasis role="strong">nicht</emphasis> der Default.<?asciidoc-br?></simpara>
<itemizedlist>
<listitem>
<simpara>
<emphasis>CallByReference</emphasis> muß über das Schlüsselwort <literal>ref</literal> explizit angegeben werden.<?asciidoc-br?>
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>CallByReference</emphasis> bedeutet, dass beim Aufruf eine Verbindung zwischen der aufrufenden Varibalen und des lokalen Aufrufparameters erstellt wird.
</simpara>
</listitem>
<listitem>
<simpara>
Eine Änderung der lokalen Variable des Aufrufparameters, wirkt sich direkt auf die beim Aufruf verwendete Variable aus.
</simpara>
</listitem>
<listitem>
<simpara>
Ein <emphasis>CallByReference</emphasis> Parameter kann nur mit einer Variable aber nicht mit einer Konstanten oder Funktion aufgerufen werden.
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_lokale_variablen_asciidoc_br">
<title>Lokale Variablen:<?asciidoc-br?></title>
<simpara>Eine Funktion enthält lokale Variablen.</simpara>
<itemizedlist>
<listitem>
<simpara>
Implizit gibt es die Aufrufparameter als lokale Variablen.
</simpara>
</listitem>
<listitem>
<simpara>
Implizit gibt es die Variable <literal>$result$</literal> welche vom Typ des Rückgabewertes ist.
</simpara>
</listitem>
<listitem>
<simpara>
Darüberhinaus können weitere Variablen innerhalb der Funktion definiert werden.<?asciidoc-br?>
</simpara>
</listitem>
<listitem>
<simpara>
All diese Variablen sind lokal, d.h. sie sind nur innerhalb dieser Funktion sichtbar.
</simpara>
</listitem>
<listitem>
<simpara>
Eine lokale Variable mit dem selben Namen einer globalen Variable,<?asciidoc-br?>
verdeckt innerhalb der Funktion die entsprechende globale Variable.
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_geschachtelte_funktionen_asciidoc_br">
<title>Geschachtelte Funktionen:<?asciidoc-br?></title>
<itemizedlist>
<listitem>
<simpara>
Eine lokale Funktion kann wiederum eine oder mehrere Definitionen von lokalen Funktionen enthalten.
</simpara>
</listitem>
<listitem>
<simpara>
Diese Funktionen sind nur innerhalb der Funktion sichtbar in der sie definiert sind.
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_rekursive_aufrufe_asciidoc_br">
<title>Rekursive Aufrufe:<?asciidoc-br?></title>
<itemizedlist>
<listitem>
<simpara>
Eine Funktion kann sich selbst rekursiv aufrufen.
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_primäre_und_sekundäre_sektionen_innerhalb_von_funktionen_asciidoc_br">
<title>Primäre und sekundäre Sektionen innerhalb von Funktionen:<?asciidoc-br?></title>
<itemizedlist>
<listitem>
<simpara>
Der Funktionskörper kann eigene Sektionen enthalten.
</simpara>
</listitem>
<listitem>
<simpara>
Diese sind lokal zu dieser Funktion also nur innerhalb der Sektion sichtbar.
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-winst-commands-localfunctions-syntax">
<title>Syntax</title>
<simpara><emphasis role="strong">Definition</emphasis></simpara>
<screen>DefFunc &lt;func name&gt;([calltype parameter type][,[calltype parameter type]]) : type
&lt;function body&gt;
endfunc</screen>
</section>
<section id="_dabei_ist">
<title>Dabei ist:</title>
<simpara><emphasis role="strong">Definition</emphasis></simpara>
<screen>DefFunc &lt;func name&gt;([calltype parameter type][,[calltype parameter type]]) : type
&lt;function body&gt;
endfunc</screen>
<itemizedlist>
<listitem>
<simpara>
<literal>DefFunc</literal> das Schlüsselwort zur Beginn der Definition einer lokalen Funktion.
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>&lt;func name&gt;</emphasis> der frei gewählte Name der Funktion.
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>calltype</emphasis> ist der Aufruftyp [<literal>val</literal> | <literal>ref</literal>]. Wird kein Aufruftyp angegeben, + so gilt <literal>val</literal> als gesetzt.
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>parameter</emphasis> ist der freigewählte Name des Aufrufparameters, welcher unter diesem Namen innerhalb der Funktion als lokale Variable zur Verfügung steht.
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>type</emphasis> ist der Datentyp des Parameters bzw. der Funktion und entweder <literal>string</literal> oder <literal>stringlist</literal>;
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>&lt;function body&gt;</emphasis>: ist der Körper der Funktion, welcher dem opsi-script syntax genügen muß.<?asciidoc-br?>
In diesem Teil gibt es die automatisch erzeugte lokale Variable <literal>$result$</literal>,
welche den Datentyp der Funktion hat (String/Stringliste) und dazu dient den Rückgabewert aufzunehmen.
</simpara>
</listitem>
<listitem>
<simpara>
<literal>endfunc</literal> zeigt als Schlüsselwort das Ende einer Funktionsdefinition an.
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-script-conf2018-advscript-local-functions-lessons">
<title>Beispiel 1</title>
<simpara>Einfache Funktion welche zwei Strings miteinander verbindet:<?asciidoc-br?>
(defined_functions0.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]
DefVar $mystr$
DefVar $str1$
set $str1$ = 'ha'

DefFunc myFunc(val $str1$ : string, $str2$ : string) : string
        set $result$ = $str1$ + $str2$
endfunc

set $mystr$ = myFunc("he","ho")
set $mystr$ = myFunc("he",timeStampAsFloatStr)
set $mystr$ = myFunc("he",$str1$)</programlisting>
<simpara>Erwartete Ergebnisse:</simpara>
<itemizedlist>
<listitem>
<simpara>
<emphasis>heho</emphasis>
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>he42921.809</emphasis>
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>heha</emphasis>
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_beispiel_2">
<title>Beispiel 2</title>
<simpara>Funktion vom Type <literal>stringlist</literal> welcher ein <literal>string</literal> und eine <literal>stringlist</literal> übergeben werden:<?asciidoc-br?>
(defined_functions1.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]
DefVar $mystr$
DefVar $str1$
DefStringlist $list1$
DefStringlist $list2$

set $str1$ = 'ha'

DefFunc myFunc1(val $str1$ : string, $list1$ : stringlist) : stringlist
        set $result$ = createStringlist($str1$ , takeString(2,$list1$))
endfunc

set $list2$ = splitstring("/etc/opsi/huhu","/")
set $list1$ = myFunc1("hi",$list2$)</programlisting>
<simpara>Erwartete Ergebnisse:</simpara>
<itemizedlist>
<listitem>
<simpara>
$list1$ = [hi,opsi]
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_beispiel_3">
<title>Beispiel 3</title>
<simpara>Funktion vom Type <literal>string</literal> welcher ein <literal>string</literal> übergeben wird:<?asciidoc-br?>
(defined_functions2.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]

DefFunc myFunc2($str1$ : string) : string
        if $str1$ &gt; "0"
                set $result$ = "true"
        else
                set $result$ = "false"
        endif
endfunc

if stringtobool(myfunc2("1"))
        comment "true"
else
        comment "false"
endif</programlisting>
<simpara>Erwartete Ergebnisse:</simpara>
<itemizedlist>
<listitem>
<simpara>
<emphasis>true</emphasis>
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_beispiel_4">
<title>Beispiel 4</title>
<simpara>Funktion vom Type <literal>string</literal> welcher ein <literal>string</literal> übergeben wird
mit lokaler Variable:<?asciidoc-br?>
(defined_functions3.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]
DefVar $mystr$

DefFunc myFunc3($str1$ : string) : string
        DefVar $locstr1$
        set $locstr1$ = '123'
        set $result$ = $locstr1$ + $str1$
endfunc

set $mystr$ = myFunc3("he")</programlisting>
<simpara>Erwartete Ergenisse:</simpara>
<itemizedlist>
<listitem>
<simpara>
<emphasis>123he</emphasis>
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_beispiel_5">
<title>Beispiel 5</title>
<simpara>Funktion vom Type <literal>string</literal> welcher ein <literal>string</literal> übergeben wird
mit lokaler Variable und geschachtelter Funktion:<?asciidoc-br?>
(defined_functions4.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]
DefVar $mystr$

DefFunc myFunc4($str1$ : string) : string
        DefVar $locstr1$

        DefFunc myFunc5($str1$ : string) : string
                set $result$ = 'inner' + $str1$
        endfunc

        set $locstr1$ = '123'
        set $result$ = $str1$ + myFunc5($locstr1$)
endfunc

set $mystr$ = myFunc4("outer")</programlisting>
<simpara>Erwartete Ergebnisse:</simpara>
<itemizedlist>
<listitem>
<simpara>
<emphasis>outerinner123</emphasis>
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_beispiel_6">
<title>Beispiel 6</title>
<simpara>Einfache Funktion vom Type <literal>string</literal> welcher ein <literal>string</literal> by reference übergeben wird mit lokaler Variable:<?asciidoc-br?>
(defined_functions6.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]
DefVar $mystr$
DefVar $str1$
DefVar $str2$

set $str1$ = 'ha'
set $str2$ = 'hi'

DefFunc myFunc6(ref $str1$ : string) : string
        DefVar $locstr1$
        set $locstr1$ = '123'
        set $str1$ = 'setinlocal'
        set $result$ = $locstr1$ + $str1$
endfunc

set $mystr$ = myFunc6($str2$)
set $mystr$ = $str1$ + $str2$</programlisting>
<simpara>Erwartete Ergebnisse:</simpara>
<itemizedlist>
<listitem>
<simpara>
<emphasis>123setinlocal</emphasis>
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>hasetinlocal</emphasis>
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_beispiel_7">
<title>Beispiel 7</title>
<simpara>Funktion vom Type <literal>stringlist</literal> welcher eine Variable vom Type  <literal>stringlist</literal> mit <emphasis>call by reference</emphasis>  übergeben wird mit lokalen <literal>stringlist</literal>  Variable:<?asciidoc-br?>
(defined_functions7.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]
DefVar $mystr$
DefStringlist $list1$
DefStringlist $list2$

set $list2$ = splitstring("/etc/opsi/huhu","/")

DefFunc myFunc7(ref $list1$ : stringlist) : stringlist
        DefStringlist $loclist1$
        set $loclist1$ = splitstring("/a/b/c","/")
        set $list1$ = createStringList('setinlocal')
        set $loclist1$ = addListToList($loclist1$,$list1$)
        set $result$ = $loclist1$
endfunc

set $list1$ = myFunc7($list2$)
comment "$list2$ index 0: " + takestring(0,$list2$)</programlisting>
<simpara>Erwartete Ergenisse:</simpara>
<itemizedlist>
<listitem>
<simpara>
$list1$ = [,a,b,c,setinlocal]
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>setinlocal</emphasis>
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_beispiel_8">
<title>Beispiel 8</title>
<simpara>Funktion vom Type <literal>stringlist</literal> welcher ein <literal>string</literal> übergeben wird
mit lokaler Variable und lokaler sekundärer Sektion:<?asciidoc-br?>
(defined_functions8.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]
DefStringlist $list1$

DefFunc myFunc8($str1$ : string) : stringlist
        DefStringlist $loclist1$
        set $loclist1$ = getoutstreamfromsection("shellInAnIcon_test")
        set $result$ = $loclist1$

        [shellinanicon_test]
        set -x
        $str1$
endfunc

if GetOS = 'Linux'
        set $list1$ = myFunc8('set -x ; pwd')
else
        set $list1$ = myFunc8('echo %cd%')
endif</programlisting>
<simpara>Erwartete Ergebnisse:
Linux:
$list1$ = [+ pwd, /home/uib/gitwork/lazarus/opsi-script]</simpara>
<simpara>Windows:</simpara>
<screen>The value of the variable "$list1$" is now:
(string   0)
(string   1)W:\opsi-script-test\CLIENT_DATA\standalone-tests&gt;echo W:\opsi-script-test\CLIENT_DATA\standalone-tests
(string   2)W:\opsi-script-test\CLIENT_DATA\standalone-tests</screen>
</section>
<section id="opsi-script-conf2018-advscript-lib">
<title>opsi-script: Libraries of Local Functions</title>
<simpara>Hier geht es um die Auslagerung von <emphasis>local functions</emphasis> in externe Dateien und um die Möglichkeit diese aus unterschiedlichen Scripten heraus aufzurufen.</simpara>
</section>
<section id="opsi-script-conf2018-advscript-lib-syntax">
<title>Syntax</title>
<simpara><literal>importLib</literal> &lt;string expr&gt;  ; import library // since 4.12.0.0<?asciidoc-br?>
&lt;string expr&gt; : &lt;file name&gt;[.&lt;file extension&gt;][<literal>::</literal>&lt;function name&gt;]<?asciidoc-br?>
Wenn keine <emphasis>.&lt;file extension&gt;</emphasis> (Dateierweiterung übergeben wird, so wird <literal>.opsiscript</literal> als Default verwendet.<?asciidoc-br?>
Wenn kein <emphasis>::&lt;function name&gt;</emphasis> über geben wird, so werden alle Funktionen der angegebenen Datei importiert.</simpara>
<simpara>&lt;file name&gt; ist:<?asciidoc-br?></simpara>
<itemizedlist>
<listitem>
<simpara>
Ein kompletter Pfad zu einer Datei. [W/L]
</simpara>
</listitem>
<listitem>
<simpara>
Eine Datei in <literal>%ScriptPath%</literal> [W/L]
</simpara>
</listitem>
<listitem>
<simpara>
Eine Datei in <literal>%opsiScriptHelperPath%\lib</literal> [W]<?asciidoc-br?>
Entspricht: <emphasis>%ProgramFiles32Dir%\opsi.org\opsiScriptHelper\lib</emphasis>
</simpara>
</listitem>
<listitem>
<simpara>
Eine Datei in <literal>%ScriptPath%/../lib</literal> //since 4.11.5.2 [W/L]
</simpara>
</listitem>
<listitem>
<simpara>
Eine Datei in <literal>%WinstDir%\lib</literal> [W]
</simpara>
</listitem>
</itemizedlist>
<simpara>Die Prüfung erfolgt in dieser Reihenfolge. Die erste Datei die gefunden wird, wird genommen.</simpara>
</section>
<section id="opsi-script-conf2018-advscript-lib-Examples">
<title>Beispiel 1</title>
<simpara>Einfache Funktion welche zwei Strings miteinander verbindet:</simpara>
<simpara>Die Library Datei myfirstlib.opsiscript:</simpara>
<programlisting language="winst" linenumbering="unnumbered">DefFunc myFunc(val $str1$ : string, $str2$ : string) : string
        set $result$ = $str1$ + $str2$
endfunc</programlisting>
<simpara>Das Programm:<?asciidoc-br?>
(defined_functions_lib1.opsiscript)</simpara>
<programlisting language="winst" linenumbering="unnumbered">[actions]
DefVar $mystr$
DefVar $str1$

importLib "%scriptpath%\myfirstlib.opsiscript"

set $str1$ = 'ha'


set $mystr$ = myFunc("he","ho")
set $mystr$ = myFunc("he",timeStampAsFloatStr)
set $mystr$ = myFunc("he",$str1$)</programlisting>
<simpara>Erwartete Ergebnisse:</simpara>
<itemizedlist>
<listitem>
<simpara>
<emphasis>heho</emphasis>
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>he42921.809</emphasis>
</simpara>
</listitem>
<listitem>
<simpara>
<emphasis>heha</emphasis>
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="_importlib_varianten">
<title>importlib Varianten</title>
<simpara>Die Zeile<?asciidoc-br?>
<literal>importLib "%scriptpath%\myfirstlib.opsiscript"</literal><?asciidoc-br?>
könnte auch folgende Form haben:</simpara>
<itemizedlist>
<listitem>
<simpara>
<literal>importLib "myfirstlib.opsiscript"</literal><?asciidoc-br?>
denn <literal>%scriptpath%</literal> ist im Suchpfad;<?asciidoc-br?>
</simpara>
</listitem>
<listitem>
<simpara>
<literal>importLib "myfirstlib"</literal><?asciidoc-br?>
denn die extension <literal>.opsiscript</literal> ist der Default;<?asciidoc-br?>
</simpara>
</listitem>
<listitem>
<simpara>
<literal>importLib "myfirstlib.opsiscript::myFunc"</literal><?asciidoc-br?>
Würde gezielt nur diese Funktion importieren.
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-script-conf2018-advscript-liblocal-missing">
<title>opsi-script: Local Functions / Libraries: Missing Features</title>
<simpara>Folgende bekannte Wünsche sind momentan noch offen:</simpara>
<itemizedlist>
<listitem>
<simpara>
proceduren (void functions)<?asciidoc-br?>
Funktionen die keinen Rückgabewert haben
</simpara>
</listitem>
<listitem>
<simpara>
function()<?asciidoc-br?>
Funktionen die keine Parameter haben
</simpara>
</listitem>
<listitem>
<simpara>
boolean functions<?asciidoc-br?>
Funktionen die (true / false) zurückliefern<?asciidoc-br?>
Workaround: Stringfunktion welche ("true"/"false") zurückliefert
und diese mit stringToBool() wandeln.
</simpara>
</listitem>
<listitem>
<simpara>
config: debug_lib<?asciidoc-br?>
Das Ausschalten des Logging für Libraries funktioniert noch nicht
</simpara>
</listitem>
<listitem>
<simpara>
syntax Fehlermeldungen mit richtiger Quellenangabe<?asciidoc-br?>
Bei Syntax Fehlern in Libraries wird noch nicht die korrekte Zeile in der korrekten Datei angezeigt
</simpara>
</listitem>
<listitem>
<simpara>
importlib innerhalb von functions<?asciidoc-br?>
Lädt momentan die Library als lokale Funktion
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-script-conf2018-advscript-lib-uib">
<title>opsi-script: UIB Library of Local Functions</title>
<simpara>opsi-script Library im opsi-winst Paket</simpara>
<simpara>Seit opsi-script 4.12.0.13 enthält das Unterverzeichnis <literal>lib</literal> Librarydateien welche von Standard opsi Produkten verwendet werden:</simpara>
<itemizedlist>
<listitem>
<simpara>
uib_backend.opsiscript
</simpara>
</listitem>
<listitem>
<simpara>
uib_bootutils.opsiscript
</simpara>
</listitem>
<listitem>
<simpara>
uib_strlistutils.opsiscript
</simpara>
</listitem>
<listitem>
<simpara>
uib_exitcode.opsiscript
</simpara>
</listitem>
</itemizedlist>
<simpara>Diese Library wird direkt von uib gepflegt und dient hauptsächlich für interne Zwecke.</simpara>
</section>
<section id="opsi-script-conf2018-advscript-lib-opsi">
<title>Project: Community driven opsi.org Library of Local Functions</title>
<simpara><emphasis role="strong">Wir starten hiermit</emphasis><?asciidoc-br?>
<emphasis role="strong">den Aufbau einer öffentlichen opsi-script Bibliothek</emphasis><?asciidoc-br?>
<emphasis role="strong">die zum Austauch innerhalb der opsi Community dienen soll</emphasis></simpara>
</section>
<section id="opsi-script-conf2018-advscript-lib-opsi-overview">
<title>Übersicht und Anforderungen</title>
<itemizedlist>
<listitem>
<simpara>
Struktur: Gliederung in Dateien nach Funktionsgruppen
</simpara>
</listitem>
<listitem>
<simpara>
Namespace
</simpara>
</listitem>
<listitem>
<simpara>
Dokumentation der Funktionen
</simpara>
</listitem>
<listitem>
<simpara>
Zentrale Versionskontrolle, Bereitstellung und Download
</simpara>
</listitem>
<listitem>
<simpara>
Test der Funktionen
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-script-conf2018-advscript-lib-opsi-structure">
<title>Struktur: Gliederung in Dateien nach Funktionsgruppen</title>
<itemizedlist>
<listitem>
<simpara>
Gliederung in Dateien nach Funktionsgruppen
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-script-conf2018-advscript-lib-opsi-name">
<title>Namespace</title>
<simpara>Namespace:</simpara>
<simpara>Ob und wie sollen die Funktionen aus dieser Library am Namen erkennbar sein ?<?asciidoc-br?>
z.B. opsi als Post- oder Prefix ?</simpara>
</section>
<section id="opsi-script-conf2018-advscript-lib-opsi-doc">
<title>Dokumentation der Funktionen</title>
<simpara>Damit Funktionen einer Library auch verwendet werden, müssen sie nach Funktion und Syntax auffindbar sein.</simpara>
<itemizedlist>
<listitem>
<simpara>
D.h. sie müssen dokumentiert und in einer zentralen Dokumentation aufgefürt sein.
</simpara>
</listitem>
<listitem>
<simpara>
Dazu wird zur Zeit ein Werkzeug entwickelt, welches auf Basis von Kommentaren innerhalb der Funktion eine Dokumentation in den Formaten HTML, PDF, ASCIIDOC erstellen kann.
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-script-conf2018-advscript-lib-opsi-git">
<title>Zentrale Versionskontrolle, Bereitstellung und Download</title>
<itemizedlist>
<listitem>
<simpara>
Wir planen die Bereitstellung der Library in unserem öffentlichen Versionskontrollsystem GIT.<?asciidoc-br?>
</simpara>
</listitem>
<listitem>
<simpara>
Zur Verteilung soll die Library natürlich auch als opsi-Paket Bereitgestellt werden
</simpara>
</listitem>
</itemizedlist>
</section>
<section id="opsi-script-conf2018-advscript-lib-opsi-test">
<title>Test der Funktionen</title>
<simpara>Für die Funktionen müssen Tests bereit stehen:</simpara>
<itemizedlist>
<listitem>
<simpara>
Diese sind als Beispiele der Dokumentation hilfreich
</simpara>
</listitem>
<listitem>
<simpara>
Überprüfung für die Entwicklenden der Funktionen
</simpara>
</listitem>
<listitem>
<simpara>
Überprüfung für die zentrale opsi-script Entwicklung
</simpara>
</listitem>
</itemizedlist>
</section>
</article>
