Seite 2 von 4
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 23 Apr 2015, 18:38
von SirTux
Danke ich war etwas blind

Ich vermute mal mit der Datei opsi-client-agent/files/opsi/cfg/config.ini liege ich nun richtig.
Ich habe nun die ersten zwei Werte ausgefüllt,
was ja richtig zu sein scheint:
Code: Alles auswählen
[installation]
service_user=adminuser
service_password=none
service_hidden_password=
Ich vermute mal es ist ebenfalls richtig die Installation über silent_setup.cmd zu starten. So funktioniert es anscheinend jedenfalls, aber leider bleibt er noch zwischendurch stehen und warte auf "any Key". Wie kann man das denn loswerden?
Danke und Grüße
SirTux
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 23 Apr 2015, 19:58
von wolfbardo
Nun ja, man kann mit der silent_setup.cmd Clients in opsi aufnehmen.
Ich persönlich würde (falls die Images mittels sysprep erstellt wurden) eher
das opsi-clonezilla script beim restore ergänzen durch die passenden Teile der Standard setup.py der win-netboot-Produkte,
d.h.
zunächst kein rebootnach dem Rückspielne des Images,
dann die Platte mounten, unattendx.ml reinkopieren und patchen analog win-netboot-Produkte eben den Rest der setup.py mit lokalem kopieren des opsiclient-agent usw.
Gruss
Bardo Wolf
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 26 Apr 2015, 23:17
von SirTux
Hallo, diese Weg ist inzwischen auch von mir präferiert. Ausführen lassen kann ich das Script über drbl_ocs_conf? Welche Anforderungen werden denn dann an die Scripte gestellt? Muß der Pfad aus Server- oder aus Clientsicht angegeben werden?
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 27 Apr 2015, 10:11
von SirTux
Ah ja, gibt es eigentlich schon sowas wie eine Warteschleife, so daß nicht alle Clients gleichzeitig saugen?
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 28 Apr 2015, 11:20
von SisterOfMercy
SirTux hat geschrieben:Ah ja, gibt es eigentlich schon sowas wie eine Warteschleife, so daß nicht alle Clients gleichzeitig saugen?
Or if every client gets the same image, perhaps using multicast is an option? This is what ghost uses when ghostcasting to multiple clients.
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 28 Apr 2015, 23:38
von SirTux
SisterOfMercy hat geschrieben:Or if every client gets the same image, perhaps using multicast is an option? This is what ghost uses when ghostcasting to multiple clients.
Das wäre eine Möglichkeit ja. Gibt es dabei was zu beachten bzw. einzustellen? Oder macht Clonezilla das automatisch?
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 03 Mai 2015, 23:37
von SirTux
SirTux hat geschrieben:Hallo, diese Weg ist inzwischen auch von mir präferiert. Ausführen lassen kann ich das Script über drbl_ocs_conf? Welche Anforderungen werden denn dann an die Scripte gestellt? Muß der Pfad aus Server- oder aus Clientsicht angegeben werden?
Scheint wohl leider nicht zu klappen. Dann werde ich das wohl direkt ins Paket einpflegen müssen.
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 04 Mai 2015, 00:38
von SirTux
Igrendwie klappt das auch nicht. Ich habe folgendes nach setupAfterInstall eingefügt. Zusätzlich habe ich die Bool'sche Produkteigenschaft installclientagent erstellt.
Code: Alles auswählen
if installclientagent:
target = '/mnt/hd'
windowsPartitionNumber = '/dev/sda1'
source = '/mnt/opsi/opsi-clonezilla-postrun/opsi-install'
srcDriversDir = source + '/drivers'
dstDriversDir = target + '/drv'
dstPeDriversDir = target + '/drvpe'
# Do hardware inventory
logger.notice(u"Fetching opsi hw audit configuration")
hwconfig = backend.auditHardware_getConfig()
logger.notice(u"Running hardware inventory")
auditHardwareOnHosts = auditHardware(config = hwconfig, hostId = clientId)
logger.notice(u"Sending hardware information to service")
backend.auditHardwareOnHost_setObsolete(clientId)
backend.auditHardwareOnHost_updateObjects(auditHardwareOnHosts)
# Get harddisks
disks = getHarddisks()
# use first disk
disk = disks[0]
# check the mount point
exitcode = os.system("test -d %s >> /dev/null 2>&1" % (target))
if (0 == int(exitcode)):
logger.notice(u"%s exists as directory - fine" % target)
else:
logger.notice(u"%s does not exists as directory - creating" % target)
os.makedirs(target)
# Mount partition
# use -t vfat for raid
logger.notice(u"mount winpe partition")
execute('mount.ntfs-3g %s %s' % (windowsPartition, target))
# Copy opsi files
depot.copy(source + '/opsi', target + '/')
# Copy opsi-client-agent
depot.copy('/opsi-client-agent', target + '/opsi/')
copy(target + '/opsi/opsi-client-agent/files/opsi/postinst.d/*', target + '/opsi/postinst.d/')
## Copy custom files
#depot.copy(source + '/custom/unattend.xml', target + '/opsi/')
#depot.copy(source + '/custom/postinst.d/*', target + '/opsi/postinst.d/')
# Copy sysconf.ini to opsi-client-agent config dir
copy(SYSCONF_INI , target + '/opsi/opsi-client-agent/files/opsi/cfg')
# Integrate drivers
os.makedirs(dstDriversDir)
os.makedirs(dstPeDriversDir)
if depot.exists(srcDriversDir):
scriptMessageSubject.setMessage("Treiber-Verzeichnis '%s' gefunden, starte Treiberintegration" % srcDriversDir)
additionalDrivers = [ ad.strip() for ad in (u','.join(productPropertyValues.get('additional_drivers', [u'']))).split(u',') ]
integrateAdditionalWindowsDrivers(srcDriversDir + u'/drivers/additional', dstDriversDir, additionalDrivers, messageSubject = scriptMessageSubject, srcRepository = depot, auditHardwareOnHosts = auditHardwareOnHosts)
integrateWindowsHardwareDrivers(srcDriversDir, dstDriversDir, auditHardwareOnHosts, messageSubject = scriptMessageSubject, srcRepository = depot)
# Patch files
logger.notice(u"Patching unattend.xml and config.ini")
for i in ( target + '/opsi/unattend.xml', target + '/opsi/opsi-client-agent/files/opsi/cfg/config.ini' ):
execute('/usr/local/bin/patcha %s' % i)
execute('/usr/local/bin/patcha -f %s %s' % (PATCHA_IN, i))
# Debug output of file content
for fn in ('/opsi/work.cmd', '/opsi/startnet.cmd', '/opsi/diskpart.txt'):
execute("%s '%s'" % (which('cat'), target + fn))
# Umount partition
logger.notice(u"umount %s >> /tmp/gpt.log 2>&1" % (windowsPartition))
execute('/bin/umount %s' % (windowsPartition))
Leider geht es nach runcommand nicht weiter. Ich habe zugegebenermaßen ocs-live ausgewählt und letztendlich nichts damit gemacht. Vielleicht liegt es daran.
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 04 Mai 2015, 12:50
von SirTux
Da gabs noch ein paar Fehler, hier die aktuellen vollständigen Änderungen:
Code: Alles auswählen
##################################################################################################
# Begin of changes
##################################################################################################
if (str(productProperties.get('installclientagent', 'true')).lower() == 'false'):
installclientagent = False
else:
installclientagent = True
if installclientagent:
##############################################################################################
# opsi-client-agent
##############################################################################################
target = '/mnt/hd'
windowsPartition = '/dev/sda1'
source = '/mnt/opsi/opsi-clonezilla-postrun/opsi-install'
srcDriversDir = source + '/drivers'
dstDriversDir = target + '/drv'
dstPeDriversDir = target + '/drvpe'
# Do hardware inventory
logger.notice(u"Fetching opsi hw audit configuration")
hwconfig = backend.auditHardware_getConfig()
logger.notice(u"Running hardware inventory")
auditHardwareOnHosts = auditHardware(config = hwconfig, hostId = clientId)
logger.notice(u"Sending hardware information to service")
backend.auditHardwareOnHost_setObsolete(clientId)
backend.auditHardwareOnHost_updateObjects(auditHardwareOnHosts)
# check the mount point
exitcode = os.system("test -d %s >> /dev/null 2>&1" % (target))
if (0 == int(exitcode)):
logger.notice(u"%s exists as directory - fine" % target)
else:
logger.notice(u"%s does not exists as directory - creating" % target)
os.makedirs(target)
# Mount partition
# use -t vfat for raid
logger.notice(u"mount winpe partition")
execute('mount.ntfs-3g %s %s' % (windowsPartition, target))
# Copy opsi files
depot.copy(source + '/opsi', target + '/')
# Copy opsi-client-agent
depot.copy('/opsi-client-agent', target + '/opsi/')
copy(target + '/opsi/opsi-client-agent/files/opsi/postinst.d/*', target + '/opsi/postinst.d/')
## Copy custom files
#depot.copy(source + '/custom/unattend.xml', target + '/opsi/')
#depot.copy(source + '/custom/postinst.d/*', target + '/opsi/postinst.d/')
# Copy sysconf.ini to opsi-client-agent config dir
copy(SYSCONF_INI , target + '/opsi/opsi-client-agent/files/opsi/cfg')
# Integrate drivers
os.makedirs(dstDriversDir)
os.makedirs(dstPeDriversDir)
if depot.exists(srcDriversDir):
scriptMessageSubject.setMessage("Treiber-Verzeichnis '%s' gefunden, starte Treiberintegration" % srcDriversDir)
additionalDrivers = [ ad.strip() for ad in (u','.join(productPropertyValues.get('additional_drivers', [u'']))).split(u',') ]
integrateAdditionalWindowsDrivers(srcDriversDir + u'/drivers/additional', dstDriversDir, additionalDrivers, messageSubject = scriptMessageSubject, srcRepository = depot, auditHardwareOnHosts = auditHardwareOnHosts)
integrateWindowsHardwareDrivers(srcDriversDir, dstDriversDir, auditHardwareOnHosts, messageSubject = scriptMessageSubject, srcRepository = depot)
# Patch files
logger.notice(u"Patching unattend.xml and config.ini")
for i in ( target + '/opsi/unattend.xml', target + '/opsi/opsi-client-agent/files/opsi/cfg/config.ini' ):
execute('/usr/local/bin/patcha %s' % i)
execute('/usr/local/bin/patcha -f %s %s' % (PATCHA_IN, i))
# Debug output of file content
for fn in ('/opsi/work.cmd', '/opsi/startnet.cmd', '/opsi/diskpart.txt'):
execute("%s '%s'" % (which('cat'), target + fn))
# Umount partition
logger.notice(u"umount %s >> /tmp/gpt.log 2>&1" % (windowsPartition))
execute('/bin/umount %s' % (windowsPartition))
##############################################################################################
# GRUB
##############################################################################################
import fileinput
import sys
def replaceAll(file,searchExp,replaceExp):
for line in fileinput.input(file, inplace=1):
if searchExp in line:
line = line.replace(searchExp,replaceExp)
sys.stdout.write(line)
bootPartition = '/dev/sda2'
rootPartition = '/dev/sda4'
execute('mount %s /mnt/hd' % (rootPartition))
execute('mount %s /mnt/hd/boot' % (bootPartition))
logger.notice(u"Changing grub default to windows")
replaceAll("/mnt/hd/boot/grub/menu.lst","default 0","default 1")
execute('hostname > /mnt/hd/etc/hostname')
execute('umount /mnt/hd/boot')
execute('umount /mnt/hd')
##################################################################################################
# End of changes
##################################################################################################
Der Mount der Windows-Partition klappt nun. Die Hardware-Inventarisierung funktioniert ebenfalls. Der Rest scheint allerdings leider noch Probleme zu machen.
Nach dem Clonezilla sieht man leider auch nichts mehr. Kann man opsi dazu bringen wieder ein Statusfenster anzuzeigen?
Re: opsi-clonezilla: opsi-join möglich?
Verfasst: 04 Mai 2015, 14:43
von SirTux
Schade ich dachte schon es läge an den fehlenden Imports:
Code: Alles auswählen
import ConfigParser
from OPSI.Util.File import IniFile
from OPSI.Backend.BackendManager import BackendManager
from OPSI.Backend.JSONRPC import JSONRPCBackend
from OPSI.Util import md5sum
from hashlib import md5
from twisted.conch.ssh import keys
Aber die gabs in der von adaptierten Version ja auch noch gar nicht und sie funktionierte ja trotzdem. Andererseits habe ich den Eindruck, daß er mit depot.* nichts anzufangen weiß.