[Gelöst] neue Clients - Standard-Pakete

CreaB
Beiträge: 8
Registriert: 23 Jan 2014, 08:06

[Gelöst] neue Clients - Standard-Pakete

Beitrag von CreaB »

Hallo!

Ich suche derzeit eine Möglichkeit neuen Clients nach der Installation des opsi-client-agents automatisiert bestimmte Standard-Pakete zu installieren.
Ich habe dazu ein "dummy"-Paket samt Abhängigkeiten generiert und suche nun die Möglichkeit neuen Clients dieses Paket zu zu weisen.

Da die "pcproto.ini"-Methode ja als veraltet gilt, wollt ich hiermit erfragen ob eine andere Methode zur Realisierung dieses Anliegens bekannt ist.

Vielen Dank im Vorraus!
Zuletzt geändert von CreaB am 09 Feb 2014, 02:50, insgesamt 1-mal geändert.
Benutzeravatar
n.wenselowski
Ex-uib-Team
Beiträge: 3194
Registriert: 04 Apr 2013, 12:15

Re: neue Clients - Standard-Pakete

Beitrag von n.wenselowski »

Hallo CreaB,

mein Weg das anzugehen wäre das Überschreiben der Methode zum Client anlegen (bspw. createClient oder host_createObjects) im extend.d-Verzeichnis.

Ich bin gespannt, welche Lösung andere noch für dieses Problem haben!


Gruß

Niko

Code: Alles auswählen

import OPSI
Benutzeravatar
tobias
Beiträge: 1294
Registriert: 20 Aug 2008, 12:36
Wohnort: Braunschweig
Kontaktdaten:

Re: neue Clients - Standard-Pakete

Beitrag von tobias »

Wir legen unsere clients direkt aus unserer Hardware Datenbank an.
Dabei werden die entsprechenden Methoden per Webservice aufgerufen.
So wird dann Client angelegt, Windows Installation auf Setup gesetzt und die entsprechenden Localboot Produkte :)
Zusätzlich wird das Feld Beschreibung mit der Benutzerzuordnung aus der CMDB gefüllt.
CreaB
Beiträge: 8
Registriert: 23 Jan 2014, 08:06

Re: neue Clients - Standard-Pakete

Beitrag von CreaB »

tobias hat geschrieben:Wir legen unsere clients direkt aus unserer Hardware Datenbank an.
Dabei werden die entsprechenden Methoden per Webservice aufgerufen.
So wird dann Client angelegt, Windows Installation auf Setup gesetzt und die entsprechenden Localboot Produkte :)
Zusätzlich wird das Feld Beschreibung mit der Benutzerzuordnung aus der CMDB gefüllt.
Wie genau sieht denn dieser Aufruf aus? Ich überlege gerade ob es möglich/sinnvoll ist via batch/Powershell einfach einen web-aufruf zu starten welcher ein dummy-/meta-paket zuweist und folglich dafür sorgt das alle gewünschten Pakete installiert werden.
Benutzeravatar
tobias
Beiträge: 1294
Registriert: 20 Aug 2008, 12:36
Wohnort: Braunschweig
Kontaktdaten:

Re: neue Clients - Standard-Pakete

Beitrag von tobias »

Hab dir mal nen Teil aus unserem Quellcode (PHP) kopiert. Du benötigst dazu http://jsonrpcphp.org/
Ob es ein JSON RPC Modul für Powershell gibt weis ich nicht.

Code: Alles auswählen

//OPSI
error_reporting(0);
$dom = $_SESSION[autofill_institut];
$name = $_SESSION[autofill_name];
$nameklein = strtolower($name);       
$domklein = strtolower($dom);
if ($_POST[opsiclient] == ""){}
//OPSI new
if ($_POST[opsiclient] == "new"){
 $dom = "BS";
 $domklein = "bs";
 $check = @fopen('https://administrator:<PASSWORD>@opsiserver.domaene.de:4447/rpc', "r");
 $rpc = @new jsonRPCClient('https://administrator:<PASSWORD>@opsiserver.domaene.de:4447/rpc', false, true);

 if($rpc) {
  try {
   $check = $rpc->authenticated();
   if(!$check) {
    $loginerror=true;
   }
   else{
    $info = $rpc->getOpsiInformation_hash();
    $newclient = $rpc->createClient("$_SESSION[autofill_name]", "$dom.domaene.de", "$_SESSION[autofill_benutzer]", "Erzeugt vom IT-Helpdesk.", "", "$_SESSION[autofill_mac]");
    //OPSI Win7?!
    if($_SESSION[autofill_os] == "W7" || $_SESSION[autofill_os] == "W7 EN"){
     $SetOS = $rpc->setProductActionRequest("win7", "$nameklein.$domklein.domaene.de", 'setup');
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "flag_active", "on", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_expires", "never", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_groupmember", "Administratoren", "$_SESSION[autofill_name]" . "." . "$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_username", "localAdmin", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_userpasswd", "$_SESSION[autofill_passwort]", "$nameklein"."."."$domklein".".domaene.de");
     $setlocalAdmin = $rpc->setProductActionRequest("localusermanagementsystem", "$nameklein"."."."$domklein".".domaene.de",'setup');
    }
    if($_SESSION[autofill_os] == "W7 64bit"){
     $SetOS = $rpc->setProductActionRequest("win7-x64", "$nameklein.$domklein.domaene.de", 'setup');
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "flag_active", "on", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_expires", "never", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_groupmember", "Administratoren", "$_SESSION[autofill_name]" . "." . "$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_username", "localAdmin", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_userpasswd", "$_SESSION[autofill_passwort]", "$nameklein"."."."$domklein".".domaene.de");
     $setlocalAdmin = $rpc->setProductActionRequest("localusermanagementsystem", "$nameklein"."."."$domklein".".domaene.de",'setup');
    }
    if($_SESSION[autofill_office] == "2010"){
     $SetSoftware = $rpc->setProductActionRequest("office_2010", "$_SESSION[autofill_name]"."."."$domklein".".domaene.de",'setup');
    }
    //OPSI defaultProducts
    if($_SESSION[autofill_defaultprod] == "1"){
     $SetDefaultProducts = $rpc->setProductActionRequestWithDependencies("defaultproducts", "$_SESSION[autofill_name]"."."."$domklein".".domaene.de", "setup");
     if($_SESSION[autofill_typ]== "NB"){
      $setAnyConnect = $rpc->setProductActionRequest("anyconnect", "$nameklein"."."."$domklein".".domaene.de", 'setup');
     }
    }
   }
  }
  catch (Exception $e) {
   $loginerror = true;
  }
 }
}
//OPSI del
if ($_POST[opsiclient] == "del"){
 $check = @fopen('https://administrator:<PASSWORD>@opsiserver.domaene.de:4447/rpc', "r");
 $rpc = @new jsonRPCClient('https://administrator:<PASSWORD>@opsiserver.domaene.de:4447/rpc', false, true);

 if($rpc) {
  try {
   $check = $rpc->authenticated();
   if(!$check) {
    $loginerror=true;
   }
   else{
    $info = $rpc->getOpsiInformation_hash();
    $newclient = $rpc->deleteClient("$_SESSION[autofill_name].$domklein.domaene.de");
   }
  }
  catch (Exception $e) {
   $loginerror = true;
  }
 }
}
error_reporting(E_ERROR | E_WARNING | E_PARSE);
//OPSI end
CreaB
Beiträge: 8
Registriert: 23 Jan 2014, 08:06

Re: neue Clients - Standard-Pakete

Beitrag von CreaB »

tobias hat geschrieben:Hab dir mal nen Teil aus unserem Quellcode (PHP) kopiert. Du benötigst dazu http://jsonrpcphp.org/
Ob es ein JSON RPC Modul für Powershell gibt weis ich nicht.

Code: Alles auswählen

//OPSI
error_reporting(0);
$dom = $_SESSION[autofill_institut];
$name = $_SESSION[autofill_name];
$nameklein = strtolower($name);       
$domklein = strtolower($dom);
if ($_POST[opsiclient] == ""){}
//OPSI new
if ($_POST[opsiclient] == "new"){
 $dom = "BS";
 $domklein = "bs";
 $check = @fopen('https://administrator:<PASSWORD>@opsiserver.domaene.de:4447/rpc', "r");
 $rpc = @new jsonRPCClient('https://administrator:<PASSWORD>@opsiserver.domaene.de:4447/rpc', false, true);

 if($rpc) {
  try {
   $check = $rpc->authenticated();
   if(!$check) {
    $loginerror=true;
   }
   else{
    $info = $rpc->getOpsiInformation_hash();
    $newclient = $rpc->createClient("$_SESSION[autofill_name]", "$dom.domaene.de", "$_SESSION[autofill_benutzer]", "Erzeugt vom IT-Helpdesk.", "", "$_SESSION[autofill_mac]");
    //OPSI Win7?!
    if($_SESSION[autofill_os] == "W7" || $_SESSION[autofill_os] == "W7 EN"){
     $SetOS = $rpc->setProductActionRequest("win7", "$nameklein.$domklein.domaene.de", 'setup');
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "flag_active", "on", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_expires", "never", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_groupmember", "Administratoren", "$_SESSION[autofill_name]" . "." . "$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_username", "localAdmin", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_userpasswd", "$_SESSION[autofill_passwort]", "$nameklein"."."."$domklein".".domaene.de");
     $setlocalAdmin = $rpc->setProductActionRequest("localusermanagementsystem", "$nameklein"."."."$domklein".".domaene.de",'setup');
    }
    if($_SESSION[autofill_os] == "W7 64bit"){
     $SetOS = $rpc->setProductActionRequest("win7-x64", "$nameklein.$domklein.domaene.de", 'setup');
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "flag_active", "on", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_expires", "never", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_groupmember", "Administratoren", "$_SESSION[autofill_name]" . "." . "$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_username", "localAdmin", "$nameklein"."."."$domklein".".domaene.de");
     $setHostParameter = $rpc->setProductProperty("localusermanagementsystem", "val_userpasswd", "$_SESSION[autofill_passwort]", "$nameklein"."."."$domklein".".domaene.de");
     $setlocalAdmin = $rpc->setProductActionRequest("localusermanagementsystem", "$nameklein"."."."$domklein".".domaene.de",'setup');
    }
    if($_SESSION[autofill_office] == "2010"){
     $SetSoftware = $rpc->setProductActionRequest("office_2010", "$_SESSION[autofill_name]"."."."$domklein".".domaene.de",'setup');
    }
    //OPSI defaultProducts
    if($_SESSION[autofill_defaultprod] == "1"){
     $SetDefaultProducts = $rpc->setProductActionRequestWithDependencies("defaultproducts", "$_SESSION[autofill_name]"."."."$domklein".".domaene.de", "setup");
     if($_SESSION[autofill_typ]== "NB"){
      $setAnyConnect = $rpc->setProductActionRequest("anyconnect", "$nameklein"."."."$domklein".".domaene.de", 'setup');
     }
    }
   }
  }
  catch (Exception $e) {
   $loginerror = true;
  }
 }
}
//OPSI del
if ($_POST[opsiclient] == "del"){
 $check = @fopen('https://administrator:<PASSWORD>@opsiserver.domaene.de:4447/rpc', "r");
 $rpc = @new jsonRPCClient('https://administrator:<PASSWORD>@opsiserver.domaene.de:4447/rpc', false, true);

 if($rpc) {
  try {
   $check = $rpc->authenticated();
   if(!$check) {
    $loginerror=true;
   }
   else{
    $info = $rpc->getOpsiInformation_hash();
    $newclient = $rpc->deleteClient("$_SESSION[autofill_name].$domklein.domaene.de");
   }
  }
  catch (Exception $e) {
   $loginerror = true;
  }
 }
}
error_reporting(E_ERROR | E_WARNING | E_PARSE);
//OPSI end

Ok, vielen Dank!

ich glaube das ist nicht so recht was ich suche, ich bräuchte eher die Möglichkeit das via batch/powershell mit einem kleinen script, oder aber via config auf dem Server selbst default-pakete fest zu legen und samt Abhängigkeiten zu installieren.
Benutzeravatar
tobias
Beiträge: 1294
Registriert: 20 Aug 2008, 12:36
Wohnort: Braunschweig
Kontaktdaten:

Re: neue Clients - Standard-Pakete

Beitrag von tobias »

du könntest dir das auch auf dem server zurecht stricken.
auch in VBS oder sonstigen sprachen kannst du das einbauen - musst du natürlich schauen das JSON-RPC von dieser sprache unterstützt wird.

Oder eben die entsprechende Methode Serverseitig anpassen - so das automatisch die Software auf Setup gesetzt wird wenn ein Client angelegt wird.
Benutzeravatar
n.wenselowski
Ex-uib-Team
Beiträge: 3194
Registriert: 04 Apr 2013, 12:15

Re: neue Clients - Standard-Pakete

Beitrag von n.wenselowski »

Hallo zusammen,

PowerShell kann direkt mit JSON-RPC arbeiten.
Wie das geht steht bspw. hier: https://powertoe.wordpress.com/2011/01/ ... owershell/

Wer keine Custom-Methoden für den Webservice selbst schreiben will, der kann das auch im Rahmen eines bestehenden Support-Vertrags umsetzen lassen ;)


Ein schönes Wochenende wünscht

Niko

Code: Alles auswählen

import OPSI
CreaB
Beiträge: 8
Registriert: 23 Jan 2014, 08:06

Re: neue Clients - Standard-Pakete

Beitrag von CreaB »

Ich hab mittlerweile mal etwas zusammen-gescripted, allerdings bekomme ich, mir unerklärliche, Fehler zurück:

Code: Alles auswählen

$urlJSON = 'https://xxx.xxx.xxx.xxx:4447/rpc'

Function CallJSON($url,$object) {
    
    $authUser = "[username]"
    $authPass = "[password]"    
    $cred = New-Object System.Net.NetworkCredential -ArgumentList $authUser,$authPass

    $bytes = [System.Text.Encoding]::ASCII.GetBytes($object)
    $web = [System.Net.WebRequest]::Create($url)

    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
    $web.Credentials = $cred
    
    $web.Method = "POST"
    $web.ContentLength = $bytes.Length
    $web.ContentType = "application/json"
    $stream = $web.GetRequestStream()
    $stream.Write($bytes,0,$bytes.Length)
    $stream.close()
    $reader = New-Object System.IO.Streamreader -ArgumentList $web.GetResponse().GetResponseStream()
    return $reader.ReadToEnd()| ConvertFrom-Json
    $reader.Close()
}

#Create the JSON object to call the user.get function and parameter extend
$data = (New-Object PSObject |
    Add-Member -PassThru NoteProperty method "setHostNotes" |
    Add-Member -PassThru NoteProperty params @{hostId="[server].domain.tld";notes="testnote"} |
    Add-Member -PassThru NoteProperty id '2') | ConvertTo-Json

$request = CallJSON $urlJSON $data
$request
gibt: @{message=Bad fqdn: 'notes'; class=ValueError}


Code: Alles auswählen

$urlJSON = 'https://xxx.xxx.xxx.xxx:4447/rpc'

Function CallJSON($url,$object) {
    
    $authUser = "[username]"
    $authPass = "[password]" 
    $cred = New-Object System.Net.NetworkCredential -ArgumentList $authUser,$authPass

    $bytes = [System.Text.Encoding]::ASCII.GetBytes($object)
    $web = [System.Net.WebRequest]::Create($url)

    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
    $web.Credentials = $cred
    
    $web.Method = "POST"
    $web.ContentLength = $bytes.Length
    $web.ContentType = "application/json"
    $stream = $web.GetRequestStream()
    $stream.Write($bytes,0,$bytes.Length)
    $stream.close()
    $reader = New-Object System.IO.Streamreader -ArgumentList $web.GetResponse().GetResponseStream()
    return $reader.ReadToEnd()| ConvertFrom-Json
    $reader.Close()
}

#Create the JSON object to call the user.get function and parameter extend
$data = (New-Object PSObject |
    Add-Member -PassThru NoteProperty method "setProductActionRequestWithDependencies" |
    Add-Member -PassThru NoteProperty params @{productId="[paket_id]";clientId="[server].domain.tld";actionRequest="setup"} |
    Add-Member -PassThru NoteProperty id '2') | ConvertTo-Json

$request = CallJSON $urlJSON $data
$request
gibt: @{message=u'[server].domain.tld'; class=KeyError}


Vielleicht kennt jemand das Problem?

[EDIT]

so funktioniert es:

Code: Alles auswählen

$urlJSON = 'https://xxx.xxx.xxx.xxx:4447/rpc'

Function CallJSON($url,$object) {
    
    $authUser = "[username]"
    $authPass = "[password]" 
    $cred = New-Object System.Net.NetworkCredential -ArgumentList $authUser,$authPass

    $bytes = [System.Text.Encoding]::ASCII.GetBytes($object)
    $web = [System.Net.WebRequest]::Create($url)

    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
    $web.Credentials = $cred
    
    $web.Method = "POST"
    $web.ContentLength = $bytes.Length
    $web.ContentType = "application/json"
    $stream = $web.GetRequestStream()
    $stream.Write($bytes,0,$bytes.Length)
    $stream.close()
    $reader = New-Object System.IO.Streamreader -ArgumentList $web.GetResponse().GetResponseStream()
    return $reader.ReadToEnd()| ConvertFrom-Json
    $reader.Close()
}

#Create the JSON object to call the user.get function and parameter extend
$data = (New-Object PSObject |
    Add-Member -PassThru NoteProperty method "setProductActionRequestWithDependencies" |
    Add-Member -PassThru NoteProperty params @("[paket_id]";"[server].domain.tld";"setup") |
    Add-Member -PassThru NoteProperty id '2') | ConvertTo-Json

$request = CallJSON $urlJSON $data
$request
Benutzeravatar
tobias
Beiträge: 1294
Registriert: 20 Aug 2008, 12:36
Wohnort: Braunschweig
Kontaktdaten:

Re: [Gelöst] neue Clients - Standard-Pakete

Beitrag von tobias »

Nice magst du das im WIKI posten?
Hier im Forum geht sowas wertvolles leider immer schnell verloren :(
Antworten