Betrieb von opsi-script unter Linux oder macOS
Seit Version 4.11.4 steht 'opsi-script' auch unter Linux zur Verfügung.
Seit Version 4.12.1 steht 'opsi-script' auch unter macOS zur Verfügung.
Bedingt durch den Fortgang der Portierung und durch die Unterschiede der Betriebssysteme stehen bestimmte Funktionalitäten nicht unter allen Betriebssystemen zur Verfügung. Im folgenden sind entsprechende Abschnitte markiert:
-
[W/L/M] sowohl unter Windows, Linux als auch unter macOS verfügbar
-
[W] nur unter Windows verfügbar
-
[L] nur unter Linux verfügbar
-
[M] nur unter macOS verfügbar
Wichtige Unterschiede und Hinweise
'opsi-script.exe' ist unter Windows ein GUI Programm, welches über den Parameter /silent
auch ohne GUI gestartet werden kann.
'opsi-script' unter Linux und macOS ist ein Kommandozeilen Programm, welches auch ohne Zugriff auf ein Display gestartet werden kann.
Es prüft aber automatisch ob der Zugriff auf ein grafisches Display möglich ist
und startet wenn möglich die grafische Variante 'opsi-script-gui'. Dies kann über den Parameter -silent
unterdrückt werden.
'opsi-script-gui' ist eine GUI Version, welche sich auch nicht ohne grafisches Display starten lässt.
Unter Linux und macOS ist das Parameterzeichen nicht "/" sondern "-". Also statt unter Windows opsi-script /help
hier opsi-script -help
.
Pfade unter Linux
Unter Linux sind die unterschiedlichen Komponenten gemäß des Linux Filesystem Hierachie Standard nicht an einer Stelle zu finden. Daher hier ein Überblick:
Seit opsi-client-agent 4.2 liegen all Komponenten von opsi-script unter /opt/opsi-script/
.
Vor opsi-client-agent 4.2:
* Ausführbare Programme:
/usr/bin/opsi-script
/usr/bin/opsi-script-nogui
-
Language files:
/usr/share/locale
-
Skin files:
Default =/usr/share/opsi-script/skin
Custom =/usr/share/opsi-script/customskin
-
opsi-script library files:
/usr/share/opsi-script/lib
Unabhängig von der Version gilt:
-
Verzeichnisse für Logdateien:
Ausgeführt als root:/var/log/opsi-script
Ausgeführt als user:/tmp
-
Config files:
/etc/opsi-script
Pfade unter macOS
Unter macOS liegen all Komponenten von opsi-script unter /Applications/opsi-script/
.
-
Verzeichnisse für Logdateien:
Ausgeführt als root:/var/log/opsi-script
Ausgeführt als user:/tmp
-
Config files:
/etc/opsi-script
Verwendung von Pfaden in opsiscript
Seit Version 4.11.4 wird bei allen Funktionen welche einen Pfad erwarten, intern eine Funktion aufgerufen welchen den übergebenen String in einen für das Betriebssystem gültigen Pfad wandeln. Es werden also alle Pfadtrennzeichen korrekt gesetzt. So wird z.B. aus dem Pfad /home/opsiproduct\myproduct\CLIENT_DATA
unter Linux /home/opsiproduct/myproduct/CLIENT_DATA
. Dies bedeutet auch, dass unter Linux keine Dateien angelegt oder verarbeitet werden können welche einen Backslash im Namen haben.
Linuxspezifische Funktionen
Zur Unterstützung von Linux gibt es folgende Linuxspezifische Funktionen:
-
GetOS
// 'Linux' or 'Windows_NT' [W/L/M] GetOS -
getLinuxDistroType
// 'debian' or 'redhat' or 'suse' [L] getLinuxDistroType -
getLinuxVersionMap
[L] getLinuxVersionMap -
chmod
in Files Sektionen [L/M] chmod -
waitForPackageLock(
<wait_seconds>,<abort_on_timeout>`) : bool` waitForPackageLock
In den folgenden Kapiteln werden spezielle opsi Linux Befehle zur Installation von Software vorgestellt, welche aus der opsi-script Library uib_lin_install
stammen. Diese Dokumentation ist in Englisch, da sie direkt aus dem Quellcode automatisch generiert wurde.
Zum Verständnis zunächst ein Überblick über die unterschiedlichen Ansätze der Methoden:
-
Distributionsunabhängige Methoden:
-
cleanupPackageSystem
-
installupdates
-
-
Installation von einem oder mehreren Paketen aus online Repos für eine spezifische Distribution
Soll nur ein Paket installiert werden, so ist in dem Aufrufen statt $packagelist$, zu verwenden:createStringList(<package name>)
Die Paketnamen in der Liste müssen zur Distribution / Version passen.-
debinstall($packagelist$ : stringlist) : string //since 4.12.4 [L]
-
redinstall($packagelist$ : stringlist) : string //since 4.12.4 [L]
-
suseinstall($packagelist$ : stringlist) : string //since 4.12.4 [L]
-
ucsinstall($packagelist$ : stringlist) : string //since 4.12.4 [L]
-
-
Installation / Deinstallation von einem oder mehren Paketen für eine bekannte Distribution / Version (d.h. Paketnamen müssen passen).
Der notwendige Befehl wird anhand der Distribution ermittelt.-
genericLinInstall($packagelist$ : stringlist) : string
-
linuxRemoveOnePackage($packagename$ : string) : string
-
linuxInstallOneFile($packagefile$ : string) : string
-
-
Installation / check / deinstallation von einem Paket aus online Repos für unterschiedliche Distributionen / Versionen, weswegen das Paket auch unterschiedliche Namen haben kann.
D.h. es wird davon ausgegangen, das die Paketnamen in der Liste alles pseudonyme für das selbe Paket sind aber für unterschiedliche Versionen bzw. Distributionen. Der notwendige Befehl wird anhand der Distribution ermittelt.-
linuxInstallOneOf($packagelist$ : stringlist) : string
-
isOneInstalled($packagelist$ : stringlist) : string
-
linuxRemoveOneOf($packagelist$ : stringlist) : string
-
Die Details zu den genannten Befehlen der Library finden sich hier: Documentation of opsi library: uib_lin_install.opsiscript
Verweise auf diese und weitere Linux-spezifische Bibliotheks Funktionen finden Sie hier: Linux specific functions
Beispiel Scripte für Linux
Nur unter Linux ausführen
[Actions]
DefVar $OS$
set $OS$ = GetOS
if not ($OS$ = "Linux")
logError "Installation aborted: wrong OS version: only Linux allowed"
isFatalError "wrong OS"
endif
Welche Linux Version
[Actions]
DefVar $distCodeName$
DefVar $distroName$
DefVar $distRelease$
DefVar $distrotype$
DefStringList $linuxInfo$
set $distrotype$ = getLinuxDistroType
set $linuxInfo$ = getLinuxVersionMap
set $distCodeName$ = getValue("Codename", $linuxInfo$)
set $distRelease$ = getValue("Release", $linuxInfo$)
set $distroName$ = getValue("Distributor ID", $linuxInfo$)
Distro | Distributor ID | Release | Codename | Description |
---|---|---|---|---|
Ubuntu Focal |
Ubuntu |
20.04 |
focal |
|
Debian 8 |
Debian |
8.3 |
jessie |
Debian GNU/Linux 8.3 (jessie) |
openSUSE Leap 42.1 |
SUSE LINUX |
42.1 |
n/a |
openSUSE Leap 42.1 (x86_64) |
SLES12SP1 |
SUSE LINUX |
12.1 |
n/a |
SUSE Linux Enterprise Server 12 SP1 |
CentOS 7.0 |
CentOS |
7.0.1406 |
Core |
CentOS Linux release 7.0.1406 (Core) |
RedHat 7.0 |
RedHatEnterpriseServer |
7.0 |
Maipo |
Red Hat Enterprise Linux Server release 7.0 (Maipo) |
UCS 4.1 |
Univention |
4.1-1 errata122 |
Vahr |
Univention Corporate Server 4.1-1 errata122 (Vahr) |
ShellScript Aufruf
[Actions]
ShellScript_ls
[ShellScript_ls]
set -x
ls
exit $?
Es ist oft hilfreich mit set -x
anzufangen, damit der Skriptablauf in der Logdatei erkennbar ist. Die letzte Zeile sollte exit $?
sein, damit zumindest der letzte exitcode der Sektion übergeben wird.
Hinzufügen eines Linux Paket Repositories
[Actions]
DefVar $newrepo$
set $newrepo$ = "deb http://download.opensuse.org/repositories/home:/uibmz:/opsi:/opsi40/Debian_7.0/ ./"
comment "Method 1: use add-apt-repository ..."
ShellScript_add_rep_deb
ShellScript_add_repokey_deb
comment "Method 2: use add-apt-repository ..."
PatchTextFile_add_repo_deb "/etc/apt/sources.list"
ShellScript_add_repokey_deb
[ShellScript_add_rep_deb]
set -x
export export DEBIAN_FRONTEND=noninteractive
apt-get --yes --force-yes install software-properties-common
apt-get --yes --force-yes install python-software-properties
add-apt-repository '$newrepo$'
exit $?
[PatchTextFile_add_repo_deb]
FindLine_StartingWith "$newrepo$"
DeleteTheLine
GoToBottom
InsertLine "$newrepo$"
[ShellScript_add_repokey_deb]
set -x
export wget --no-check-certificate -O - $newrepo$/Release.key | apt-key add -
apt-get update
exit $?
[Actions]
DefVar $newrepo$
set $newrepo$ = "http://download.opensuse.org/repositories/home:/uibmz:/opsi:/opsi40/openSUSE_13.1/home:uibmz:opsi:opsi40.repo"
ShellScript_add_opsi_repository_suse
[ShellScript_add_opsi_repository_suse]
set -x
export zypper --no-gpg-checks --non-interactive --gpg-auto-import-keys ar --refresh $newrepo$
zypper --no-gpg-checks --non-interactive --gpg-auto-import-keys refresh
exit $?
[Actions]
DefVar $newrepo$
set $newrepo$ = "http://download.opensuse.org/repositories/home:/uibmz:/opsi:/opsi40/CentOS_7/home:uibmz:opsi:opsi40.repo"
comment "Method 1: use wget ..."
ShellScript_add_repo_redhat
ShellScript_refresh_repo_redhat
comment "Method 2: use PatchTextFile ..."
PatchTextFile_add_repo_redhat "/etc/yum.repos.d/mynew.repo"
ShellScript_refresh_repo_redhat
ShellScript_add_repo_redhat
[ShellScript_add_repo_redhat]
set -x
export yum -y install wget
cd /etc/yum.repos.d
wget --no-check-certificate $newrepo$
exit $?
[PatchTextFile_add_repo_redhat]
AppendLine "[home_uibmz_opsi_opsi40]"
AppendLine "name=opsi 4.0 (CentOS_7)"
AppendLine "type=rpm-md"
AppendLine "baseurl=http://download.opensuse.org/repositories/home:/uibmz:/opsi:/opsi40/CentOS_7/"
AppendLine "gpgcheck=1"
AppendLine "gpgkey=http://download.opensuse.org/repositories/home:/uibmz:/opsi:/opsi40/CentOS_7/repodata/repomd.xml.key"
AppendLine "enabled=1"
[ShellScript_refresh_repo_redhat]
set -x
yum makecache
yum -y repolist
exit $?
Löschen eines Repositories
[Actions]
DefVar $delrepo$
DefStringlist = $resultlist$
set $delrepo$ = "deb http://download.opensuse.org/repositories/home:/uibmz:/opsi:/opsi40/Debian_7.0/ ./"
if LineBeginning_ExistsIn($delrepo$, "/etc/apt/sources.list")
PatchTextFile_del_repo_deb "/etc/apt/sources.list"
set $resultlist$ = shellCall("apt-get update")
endif
[PatchTextFile_del_repo_deb]
FindLine_StartingWith "$delrepo$"
DeleteTheLine
[Actions]
DefVar $delrepo$
comment "$delrepo$ is the section name of the repo file in /etc/zypp/repos.d/"
comment "$delrepo$ can be found by zypper lr"
set $delrepo$ = "home_uibmz_opsi_opsi40"
ShellScript_del_opsi_repository_suse
[ShellScript_del_opsi_repository_suse]
set -x
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
zypper --non-interactive rr $delrepo$
exit $?
[Actions]
DefVar $delrepo$
comment "$delrepo$ ist the name of the repo file in /etc/yum.repos.d"
set $delrepo$ = "/etc/yum.repos.d/home:uibmz:opsi:opsi40.repo"
[ShellScript_del_opsi_repository_redhat]
set -x
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
rm $delrepo$
yum makecache
yum -y repolist
exit $?
Installieren eines Paketes
A simple example:
[Actions]
importlib "uib_lin_install"
DefStringlist $packages$
DefVar $installresult$
comment "install new needed packages"
if waitForPackageLock("300", "false")
comment "we got the package lock."
else
LogError "could not get Package Lock"
endif
set $packages$ = CreateStringlist("lsb-release","cifs-utils","xterm")
set $installresult$ = genericLinInstall($packages$)
if not(stringtobool($installresult$))
LogError "failed install packages"
Message "failed install packages"
isFatalError "failed dependent packages"
endif
A more sophisticated example:
[Actions]
importlib "uib_lin_install"
DefStringlist $packages$
DefVar $installresult$
DefStringlist $errorList$
DefVar $fatal_error$
DefVar $result_string$
if waitForPackageLock("300", "false")
comment "we got the package lock."
else
LogError "could not get Package Lock"
endif
comment "update and clean package system"
cleanupPackageSystem()
comment "install pending updates"
set $result_string$ = installupdates()
comment "install new needed packages"
set $packages$ = CreateStringlist("lsb-release","cifs-utils","xterm")
set $installresult$ = genericLinInstall($packages$)
if not(stringtobool($installresult$))
if waitForPackageLock("300", "false")
comment "we got the package lock."
else
LogError "could not get Package Lock"
endif
cleanupPackageSystem()
set $installresult$ = genericLinInstall($packages$)
if not(stringtobool($installresult$))
LogError "failed install packages"
Message "failed install packages"
;isFatalError "failed install packages"
set $fatal_error$ = "true"
set $errorList$ = addtolist($errorList$, " failed install packages")
endif
endif
macOS spezifische Funktionen
Für die Unterstützung von macOS gibt es die folgenden spezifischen Funktionen:
-
GetOS
// 'Linux' or 'Windows_NT' or 'macOS' [W/L/M] GetOS -
getMacosVersionInfo
[M] getMacosVersionInfo -
getMacosVersionMap
[M] getMacosVersionMap -
getOSArchitecture
// 'x86_32' or 'x86_64' or 'arm_64' [W/L/M] OSArchitecture -
chmod
in Files sections [L/M] chmod -
importlib "uib_macosinstalllib"
: -
install_macos_app($myapp$ : string) : string
[M] -
install_macos_pkg($mypkg$ : string) : string
[M] -
install_macos_dmg($mydmg$ : string) : string
[M] -
install_macos_zip($myzip$ : string) : string
[M] -
install_macos_generic($myfile$ : string) : string
[M]
Die Details zu den genannten Befehlen der Library finden sich hier: Documentation of opsi library: uib_macosinstalllib.opsiscript
Verweise auf weitere macOS-spezifische Bibliotheks Funktionen finden Sie hier: macOS specific functions
Beispiel Scripte für macOS
Nur auf macOS ausführen
[Actions]
DefVar $OS$
set $OS$ = GetOS
if not ($OS$ = "macOS")
logError "Installation aborted: wrong OS version: only macOS allowed"
isFatalError "wrong OS"
endif
Welche macOS Version
Der code:
Set $macOSinfomap$ = getMacosVersionMap
ergibt (zum Beispiel) folgenden log:
The value of the variable "$macOSinfomap$" is now: (string 0)Release=11.0 (string 1)Build=20A5364e (string 2)kernel name=Darwin (string 3)node name=vmmac1100onmm1.uib.local (string 4)kernel release=20.1.0 (string 5)kernel version=Darwin Kernel Version 20.1.0: Fri Aug 28 20:45:30 PDT 2020; root:xnu-7195.40.65.0.2~61/RELEASE_X86_64 (string 6)machine=x86_64 (string 7)processor=i386 (string 8)operating system=macOS