opsi-admin in Bash Skript

Antworten
karstenausberlin
Beiträge: 15
Registriert: 22 Okt 2010, 12:12

opsi-admin in Bash Skript

Beitrag von karstenausberlin »

Servus,

gegeben sei /tmp/TEST.client mit folgendem Inhalt:

Code: Alles auswählen

akazie.ecobln.de
ahorn.ecobln.de
fenestrae.ecobln.de
test05.ecobln.de
Die Datei wird ganz normal unter Linux mit dem vim erstellt.

Dann nehme man folgendes Skript:

Code: Alles auswählen

#!/bin/bash


cat /tmp/TEST.clients | while read LINE; do
   opsi-admin -l7 -d -s method host_getObjects '' '{"id":"'${LINE}'"}';
done
Auch per vim.

Ergebnis:

Code: Alles auswählen

[...]

[6] arg[0]: method (opsi-admin|298)
[6] arg[1]: host_getObjects (opsi-admin|298)
[6] arg[2]:  (opsi-admin|298)
[7] cmdline: method host_getObjects '' {"id":"akazie.ecobln.de"} 'ahorn.ecobln.defenestrae.ecobln.detest05.ecobln.de' (opsi-admin|727)
[7] cmdline: method host_getObjects '' {"id":"akazie.ecobln.de"} 'ahorn.ecobln.defenestrae.ecobln.detest05.ecobln.de' (opsi-admin|727)
[2] Traceback: (Logger.py|757)
[2]   File "/usr/bin/opsi-admin", line 754, in execute
    command.execute(self, self.getParams()[1:])
 (Logger.py|757)
[2]   File "/usr/bin/opsi-admin", line 1153, in execute
    params[-1] = fromJson(params[-1], preventObjectCreation=True)
 (Logger.py|757)
[2]   File "/usr/lib/python2.7/dist-packages/OPSI/Util/__init__.py", line 154, in fromJson
    obj = json.loads(obj)
 (Logger.py|757)
[2]   File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
 (Logger.py|757)
[2]   File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
 (Logger.py|757)
[2]   File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
 (Logger.py|757)
[2]      ==>>> No JSON object could be decoded (opsi-admin|756)
[2] Traceback: (Logger.py|757)
[2]   File "/usr/bin/opsi-admin", line 354, in main
    shell.execute()
 (Logger.py|757)
[2]   File "/usr/bin/opsi-admin", line 759, in execute
    raise RuntimeError(message)
 (Logger.py|757)
[7] Calling backend_exit() on backend <BackendExtender()> (Backend.py|518)
[7] Calling backend_exit() on backend <HostControlSafeBackend(resolveHostAddress=False, maxConnections=200)> (Backend.py|518)
[7] Calling backend_exit() on backend <HostControlBackend(resolveHostAddress=False, maxConnections=200)> (Backend.py|518)
[7] Calling backend_exit() on backend <DepotserverBackend()> (Backend.py|518)
[7] Calling backend_exit() on backend <ExtendedConfigDataBackend(configDataBackend=<BackendDispatcher(dispatchConfigFile=u'/etc/opsi/backendManager/dispatch.conf', context=<BackendManager()>)>)> (Backend.py|518)
[7] Calling backend_exit() on backend <BackendDispatcher(dispatchConfigFile=u'/etc/opsi/backendManager/dispatch.conf', context=<BackendManager()>)> (Backend.py|518)
[2] Traceback: (Logger.py|757)
[2]   File "/usr/bin/opsi-admin", line 1700, in <module>
    main(sys.argv[1:])
 (Logger.py|757)
[2]   File "/usr/bin/opsi-admin", line 367, in main
    raise error
 (Logger.py|757)
[3] Error during execution: Failed to execute u'method host_getObjects \'\' {"id":"akazie.ecobln.de"} \'ahorn.ecobln.defenestrae.ecobln.detest05.ecobln.de\'': No JSON object could be decoded (opsi-admin|1708)
Wo kommt denn der Rattenschwanz ahorn.ecobln.defenestrae.ecobln.detest05.ecobln.de auf einmal her?

Noch schöner wird es, wenn man den opsi-admin-Befehl einfach doppelt aufruft.

Code: Alles auswählen

cat /tmp/TEST.clients | while read LINE; do
   opsi-admin -l7 -d -s method host_getObjects '' '{"id":"'${LINE}'"}';
   opsi-admin -l7 -d -s method host_getObjects '' '{"id":"'${LINE}'"}';
done
Dann schlägt der erste fehl, der zweite läuft wie erwartet durch... ich bin ratlos. Irgendwas stimmt doch da nicht, wie der opsi-admin mit der Variable LINE umgeht.

Er läuft in beiden Skripten dann auch nur durch akazie.ecobln.de - die anderen Schleifen/Clients werden nicht aufgerufen/ausgeführt. Oder anders gesagt - es scheint, dass die Schleife nur einmal durchläuft. Aber ist doch kein Hexenwerk, sowas... warum geht das nicht?

Code: Alles auswählen

root@foo[/1]:/usr/local/sbin # dpkg -l | grep opsi
ii  opsi-atftpd                     0.7.dfsg-7                     amd64        advanced TFTP server - opsi version with pcre, fifo and max-blksize patches
ii  opsi-configed                   4.0.7.5.22-2                   all          OPSI config editor
ii  opsi-depotserver                4.0.7.3-2                      all          opsi depotserver configuration package
ii  opsi-linux-bootimage            20170720-1                     amd64        opsi bootimage for netboot tasks.
ii  opsi-utils                      4.0.7.18-7                     all          utilites for working with opsi.
ii  opsiconfd                       4.0.7.14-1                     all          opsi configuration service
ii  opsipxeconfd                    4.0.7.9-1                      all          opsi pxe configuration daemon
ii  python-opsi                     4.0.7.52-1                     all          opsi python library
root@foo[/1]:/usr/local/sbin # cat /etc/debian_version 
9.3

LG aus B
Karsten
larsg
Beiträge: 283
Registriert: 16 Dez 2014, 18:06

Re: opsi-admin in Bash Skript

Beitrag von larsg »

probier es mal mit sudo
karstenausberlin
Beiträge: 15
Registriert: 22 Okt 2010, 12:12

Re: opsi-admin in Bash Skript

Beitrag von karstenausberlin »

Moinsen.

Ich lasse das als root laufen... aber selbst wenn ich das Skript TEST mit "sudo TEST" aufrufe, geht es nicht.

LG
Benutzeravatar
ThomasT
uib-Team
Beiträge: 529
Registriert: 26 Jun 2013, 12:26

Re: opsi-admin in Bash Skript

Beitrag von ThomasT »

Code: Alles auswählen

echo opsi-admin -d -s method host_getObjects \'[]\' \'{\"id\":\"${LINE}\"}\' | bash;
Kein Support per DM!
_________________________
opsi support - https://www.uib.de/
For productive opsi installations we recommend support contracts.
karstenausberlin
Beiträge: 15
Registriert: 22 Okt 2010, 12:12

Re: opsi-admin in Bash Skript

Beitrag von karstenausberlin »

Daaaanke!

Weißt Du auch, warum das so ist? Ich würde nie auf die Idee kommen, sowas auszuprobieren...

LG
Karsten
Benutzeravatar
ngbr
Ex-uib-Team
Beiträge: 130
Registriert: 27 Sep 2010, 11:41

Re: opsi-admin in Bash Skript

Beitrag von ngbr »

moin moin,

der opsi-admin verlangt nach einem Objekt, auf das er filtern soll.
Das sieht immer so aus:

Code: Alles auswählen

'{"id":"fqdn.des.clients"}'
wenn du das mit der Bash aufrufst, dann gibit die bash diese Zeichen nicht weiter, sondern interpretiert sie selbst.
Es ist also, als hättest du sie weggelassen.
Daher musst du sie escapen, das machen die '\' .
hab mich mal vorgedrängelt, weil sowieso die Funktion des Forums getestet werden wollte ;)

Andre
---
hoping to help :)

if your problem was solved, pls mark this thread as 'SOLVED'. thank you .

-- no PN support --

Andre
Antworten