opsi-script Local Functions

uib gmbh

opsiscript Local Functions

opsi_logo.png

Was ist das Problem

Wiederverwendbarkeit von Code wird beschränkt durch:

Vorstellung: Local Functions in opsi-script

Seit Version 4.12 kennt opsi-script auch lokale Funktionen.

Ein Beispiel:

DefFunc myFunc(val $str1$ : string, $str2$ : string) : string
        set $result$ = $str1$ + $str2$
endfunc

Konzept

Ziel dieser Erweiterung ist die Umsetzung folgender Konzepte:

Funktionen mit Rückgabewert:

Die Funktionen haben einen Rückgabewert,
welcher vom Typ string oder stringlist ist.

Der Aufruf eine solchen Funktion kann überall da erfolgen,
wo ein Stringausdruck bzw.eine Stringliste erwartet wird.

Frei definierbare Aufrufparameter:

Einer Funktion können Parameter übergeben werden.

CallByValue:

CallByValue ist der Default.

CallByReference:

CallByReference ist nicht der Default.

Lokale Variablen:

Eine Funktion enthält lokale Variablen.

Geschachtelte Funktionen:

Rekursive Aufrufe:

Sektionen innerhalb von Funktionen:

Syntax

Definition

DefFunc <func name>([calltype parameter type][,[calltype parameter type]]) : type
<function body>
endfunc

Dabei ist:

Beispiel 1

Einfache Funktion, welche zwei Strings miteinander verbindet:
(defined_functions0.opsiscript)

[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$)

Erwartete Ergebnisse:

Beispiel 2

Funktion vom Type stringlist, welcher ein string und eine stringlist übergeben werden:
(defined_functions1.opsiscript)

[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$)

Erwartete Ergebnisse:

Beispiel 3

Funktion vom Type string, welcher ein string übergeben wird:
(defined_functions2.opsiscript)

[actions]

DefFunc myFunc2($str1$ : string) : string
        if $str1$ > "0"
                set $result$ = "true"
        else
                set $result$ = "false"
        endif
endfunc

if stringtobool(myfunc2("1"))
        comment "true"
else
        comment "false"
endif

Erwartete Ergebnisse:

Beispiel 4

Funktion vom Type string, welcher ein string übergeben wird mit lokaler Variable:
(defined_functions3.opsiscript)

[actions]
DefVar $mystr$

DefFunc myFunc3($str1$ : string) : string
        DefVar $locstr1$
        set $locstr1$ = '123'
        set $result$ = $locstr1$ + $str1$
endfunc

set $mystr$ = myFunc3("he")

Erwartete Ergenisse:

Beispiel 5

Funktion vom Type string, welcher ein string übergeben wird mit lokaler Variable und geschachtelter Funktion:
(defined_functions4.opsiscript)

[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")

Erwartete Ergebnisse:

Beispiel 6

Einfache Funktion vom Type string, welcher ein string by reference übergeben wird mit lokaler Variable:
(defined_functions6.opsiscript)

[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$

Erwartete Ergebnisse:

Beispiel 7

Funktion vom Type stringlist, welcher eine Variable vom Type stringlist mit call by reference übergeben wird mit lokalen stringlist Variable:
(defined_functions7.opsiscript)

[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$)

Erwartete Ergenisse:

Beispiel 8

Funktion vom Type stringlist, welcher ein string übergeben wird mit lokaler Variable und lokaler sekundärer Sektion:
(defined_functions8.opsiscript)

[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

Erwartete Ergebnisse: Linux: $list1$ = [+ pwd, /home/uib/gitwork/lazarus/opsi-script]

Windows:

The value of the variable "$list1$" is now:
(string   0)
(string   1)W:\opsi-script-test\CLIENT_DATA\standalone-tests>echo W:\opsi-script-test\CLIENT_DATA\standalone-tests
(string   2)W:\opsi-script-test\CLIENT_DATA\standalone-tests

opsi-script: Libraries of Local Functions

Hier geht es um die Auslagerung von local functions
in externe Dateien (libraries)
und um die Möglichkeit,
diese aus unterschiedlichen Scripten heraus aufzurufen.

Syntax

importLib <string expr>

Dabei ist <string expr>:

<file name>[.<file extension>][::<function name>]

<file name> ist:

Die Prüfung erfolgt in dieser Reihenfolge. Die erste Datei, die gefunden wird, wird genommen.

Beispiel 1

Einfache Funktion welche zwei Strings miteinander verbindet:

Die Library Datei myfirstlib.opsiscript:

DefFunc myFunc(val $str1$ : string, $str2$ : string) : string
        set $result$ = $str1$ + $str2$
endfunc

Das Programm:
(defined_functions_lib1.opsiscript)

[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$)

Erwartete Ergebnisse:

importlib Varianten

Die Zeile
importLib "%scriptpath%\myfirstlib.opsiscript"
könnte auch folgende Form haben:

opsi-script: Local Functions / Libraries: Missing Features

Folgende bekannte Wünsche sind momentan noch offen:

opsi-script: UIB Library of Local Functions

opsi-script Library im opsi-winst Paket

Seit opsi-script 4.12.0.13 enthält das Unterverzeichnis lib Librarydateien,welche von Standard opsi Produkten verwendet werden:

Diese Library wird direkt von uib gepflegt und dient hauptsächlich für interne Zwecke.

Project: Community opsi-script Library

Wir starten hiermit
den Aufbau einer öffentlichen opsi-script Bibliothek,
die zum Austauch innerhalb der opsi Community dienen soll.

Übersicht und Anforderungen

Gliederung nach Funktionsgruppen

Namespace

Namespace:

Dokumentation der Funktionen

Damit Funktionen einer Library auch verwendet werden, müssen sie nach Funktion und Syntax auffindbar sein.

Zentrale Versionskontrolle, Bereitstellung und Download

Test der Funktionen

Für die Funktionen müssen Tests bereit stehen:

/

#