Änderungen

Wechseln zu: Navigation, Suche

Server-Module erstellen

12.662 Byte hinzugefügt, 21:30, 8. Nov. 2019
== Vertrag löschen ==
Wenn Sie die Löschung eines bestehenden Vertrages ebenfalls in sourceDESK integrieren möchten, können Sie die Methode <code>Delete($id)</code> implementieren..Diese muss ein Array zurückgeben, das im Erfolgsfall ein Element - <code>true</code> - besitzt und im Fehlerfall ein Element <code>false</code> sowie einen Fehlerstring als zweites Element zurückgibt.
== Vertrag sperren / entsperren ==
Über die Methoden <code>Suspend($id)</code> und <code>Unsuspend($id)</code> können Sie Verträge direkt aus sourceDESK sperren oder wieder entsperren.Die Rückgabe wird wie bei der Löschung eines Vertrages erwartetFür Schnittstellen, die nur die Übergabe eines Status verlangen, also keine separaten Endpunkte für Sperrung und Entsperrung haben, können Sie wie folgt arbeiten: <source lang="php">public function Suspend($id, $status = 1) { $this->loadOptions($id); // ... return Array(true);} public function Unsuspend($id) { return $this->Suspend($id, 0);}</source> Wichtig ist hierbei, dass der zweite Parameter von <code>Suspend()</code> einen Standard-Wert bekommt, da sourceDESK die Funktion ansonsten nicht aufrufen kann.
== Paket wechseln ==
Über die Methode <code>ChangePackage($id)</code> können Sie einen Paketwechsel direkt aus sourceDESK initiieren.Nach Wechsel des Produktes können Sie so die Änderungen direkt an den Server übermitteln.Das Rückgabeformat entspricht dem der Lösch- und Sperr-Methoden.
== Modul-Ausgabe ==
Sie können und sollten über die Methode <code>Output($id, $task = "")</code> HTML-Code zurückgeben, der im Kundenbereich und in der Administration angezeigt wird.Diese Methode behandelt auch den Aufruf Ihrer eigenen Aktionen, dann ist das Argument <code>$task</code> mit der entsprechenden Aktion gefüllt== Änderungen an Kunden-Daten ==Seit Version 1.1.3 unterstützt sourceDESK die Weitergabe von Änderungen an Kundendaten an Provisioning-Module. Sobald die Stammdaten des Kunden geändert werden, wird die Methode ''ClientChanged($id, $new)'' des Moduls aufgerufen, sofern diese vorhanden ist. Hierbei ist ''$id'' die Vertrags-ID und ''$new'' ein Array mit den geänderten Kundenfeldern. Eine Implementierung könnte so aussehen: <source lang="php">public function ClientChanged($id, array $changedFields) { if (!count(array_intersect($changedFields, ["name", "mail"]))) { return; }  $this->loadOptions($id); $c = $this->getClient($id);  $this->Call("2/UpdateUser", [ "LoginName" => $this->getData("username"), "DisplayName" => $c->get()['name'], "Email" => $c->get()['mail'], ]);}</source> == Benutzer-Speicher ==Sie können für jeden Kunden - unabhängig vom Vertrag - Daten speichern. Das eignet sich zum Beispiel, wenn Sie mehrere Verträge mit einem Modul erstellen, via API aber immer den gleichen Account nutzen möchten. Das funktioniert wie folgt: <source lang="php">// Wir befinden uns innerhalb einer Modul-Methode$user = $this->getClient($id);$user->setAccount("plesk", ["username" => "abcdef", "id" => 123]); // Zweites Argument muss unbedingt ein Array sein // Zu einem späteren Zeitpunkt$data = $user->getAccount("plesk");</source> Zu jedem Schlüssel (im Beispiel "plesk") wird nur ein Account gespeichert. Dieser kann jederzeit überschrieben werden.
== E-Mailvariablen ==
sourceDESK unterstützt den Versand von Willkommens-Emails an Kunden.Hier benötigen Sie eine Funktion <code>AllEmailVariables()</code>, die ein Array mit Namen von verfügbaren E-Mailvariablen zurückgibt.Weiter wird eine Methode <code>EmailVariables($id)</code> benötigt, die die Variablen mit konkreten Werten fülltEin Beispiel: <source lang="php">public function AllEmailVariables() { return Array( "url", "user", "password", );} public function EmailVariables($id) { $this->loadOptions($id);  return Array( "url" => $this->getOption("url"), "user" => $this->getData("username"), "password" => $this->getData("password"), );}</source>
== Eigene Funktionen ==
Sie können eigene Funktionen mit der Methode <code>OwnFunctions($id)</code> implementieren.Diese Funktionen stehen im Kundenbereich zur Verfügung.Funktionen, die Administratoren zur Verfügung stehen sollen, müssen durch die Methode <code>AdminFunctions($id)</code> zurückgegeben werden. Erwartet wird jeweils ein Array, das als Schlüssel die Aktionsnamen und als Wert die Aktionsbeschreibung enthält. Ein Beispiel zur Definition der Funktionen: <source lang="php">public function OwnFunctions($id) { return Array( "reset_mail" => "E-Mailadresse zurücksetzen", "reset_pw" => "Passwort zurücksetzen", "reset_rights" => "Rechte zurücksetzen", );} public function AdminFunctions($id) { return Array( "reset_mail" => "E-Mailadresse zurücksetzen", "reset_pw" => "Passwort zurücksetzen", "reset_rights" => "Rechte zurücksetzen", );}</source> Die Implementierung der Aktionen erfolgt in der Methode <code>Output($id, $task = "")</code>. <code>$task</code> ist dann beispielsweise <code>reset_mail</code>. In Ihrer Ausgabe können Sie dann sowohl weitere Daten abfragen als auch eine Rückmeldung an den Kunden geben.
== API-Integration ==
Sie können eigene Aufgaben definieren, die über die Hosting-API vom Kunden aufgerufen werden können..Dafür müssen Sie in der Methode <code>ApiTasks</code> die verfügbaren Aufgaben und aufzurufenden Methoden definieren, beispielsweise: <source lang="php">public function ApiTasks($id) { return Array( "SetUserPassword" => "pwd", "GetUserSites" => "", "AddUserSite" => "name,url", "DeleteUserSite" => "id", );}</source> Die entsprechenden Methoden werden mit den Parametern <code>$id</code> (ID des Hosting-Vertrags) und <code>$req</code> (Array mit Parametern) aufgerufen.
== Beispiel-Code ==
<source lang="php"><?php class CPanelProv extends Provisioning { protected $name = "cPanel"; protected $short = "cpanel"; protected $lang; protected $options = Array();  public function Config($id, $product = true) { $this->loadOptions($id, $product);  if (isset($_POST['url'])) { $res = $this->Call("listpkgs", [], $_POST); if (!$res) { die('<div class="alert alert-danger"><b>Fehler!</b> Keine Verbindung zum Server m&ouml;glich.Eventuell SSL-Zertifikat pr&uuml;fen.</div>'); }  if (!empty($res->cpanelresult->error)) { die('<div class="alert alert-danger"><b>Fehler!</b> ' .htmlentities($res->cpanelresult->error) . '</div>'); } $pkgs = $res->data->pkg;  if (count($pkgs) == 0) { die('<div class="alert alert-warning">Es existieren keine Angebote in cPanel.</div>'); }  $html = '<div class="form-group"><label>Angebot</label><select data-setting="plan" class="form-control prov_settings">';  foreach ($pkgs as $p) { $p = $p->name; if (!empty($this->getOption("plan")) && $this->getOption("plan") == $p) { $html .= "<option selected='selected'>$p</option>"; } else { $html .= "<option>$p</option>"; }  }  $html .= "</select></div>"; die($html); }  ob_start();?>  <div class="row"> <input style="opacity: 0;position: absolute;"> <input type="password" style="opacity: 0;position: absolute;">  <div class="col-md-4"> <div class="form-group"> <label>WHM-URL</label> <input type="text" data-setting="url" value="<?=$this->getOption("url");?>" placeholder="https://webspacepanel.de:2087" class="form-control prov_settings" /> </div> </div>  <div class="col-md-4"> <div class="form-group"> <label>WHM-Benutzer</label> <input type="text" data-setting="user" value="<?=$this->getOption("user");?>" placeholder="root" class="form-control prov_settings" /> </div> </div>  <div class="col-md-4"> <div class="form-group"> <label>WHM-Passwort</label> <input type="password" data-setting="password" value="<?=$this->getOption("password");?>" placeholder="L957fZviq6" class="form-control prov_settings" /> </div> </div> </div>  <a href="#" id="check_conn" class="btn btn-default btn-block">Daten vom Server abrufen</a>  <script> var doing = false; function request(){ if(doing) return; doing = !doing; $("#check_conn").html('<i class="fa fa-spin fa-spinner"></i> Daten werden abgerufen...'); $.post("?p=<?php if ($product) {?>product_<?php }?>hosting&id=<?=$_GET['id'];?>&module=cpanel", { url: $("[data-setting=url]").val(), user: $("[data-setting=user]").val(), password: $("[data-setting=password]").val(), "csrf_token": "<?=CSRF::raw(); ?>", }, function(r){ doing = false; $("#check_conn").html('Daten vom Server abrufen'); $("#server_conf").html(r); }); } <?php if (!empty($this->getOption("url"))) { echo 'request();'; } ?>  $("#check_conn").click(function(e){ e.preventDefault(); request(); }); </script>  <br /><div id="server_conf"></div>  <?php $res = ob_get_contents(); ob_end_clean(); return $res; }  private function Call($func, $data = [], $opt = false) { if (!is_array($opt)) { $opt = $this->options; } $data = is_array($data) && count($data) > 0 ? "&" . http_build_query($data) : "";  $ch = curl_init(rtrim($opt["url"], "/") . "/json-api/" . $func . "?api.version=1" . $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Basic " . base64_encode($opt["user"] . ":" . $opt["password"]) . "\n\r", ]); $res = json_decode(curl_exec($ch)); curl_close($ch); return is_object($res) ? $res : false; } public function Create($id) { global $sec; $this->loadOptions($id);  $res = $this->Call("createacct", [ "username" => "web$id", "domain" => "$id.web", "password" => $pwd = $sec->generatePassword(16, false, "lud"), "plan" => $this->getOption("plan"), ]);  if ($res->metadata->result) { return [true, [ "password" => $pwd, ]]; } else { return [false, $res->metadata->reason]; } }  public function Delete($id) { $this->loadOptions($id);  $res = $this->Call("removeacct", [ "username" => "web$id", ]);  if ($res->metadata->result) { return [true]; } else { return [false, $res->metadata->reason]; } }  public function Output($id, $task = "") { global $pars, $raw_cfg, $CFG; $this->loadOptions($id);  ob_start(); $org = $this->getOption("url"); $host = array_shift(explode(":", rtrim(substr(array_pop(explode(":", $org, 2)), 2), "/"))); $url = "https://$host:2083/";  ?> <div class="row"> <div class="col-md-6"> <div class="panel panel-default"> <div class="panel-heading">cPanel-Zugangsdaten</div> <div class="panel-body"> <b>URL:</b> <a target="_blank" href="<?=$url;?>"><?=$url;?></a><br /> <b>Benutzername:</b> web<?=$id;?><br /> <b>Passwort:</b> <?=$this->getData("password"); ?></a> </div> </div> </div>  <div class="col-md-6"> <div class="panel panel-default"> <div class="panel-heading">FTP-Zugangsdaten</div> <div class="panel-body"> <b>Host:</b> <?=$host; ?><br /> <b>Benutzername:</b> web<?=$id;?><br /> <b>Passwort:</b> <?=$this->getData("password");?> </div> </div> </div> </div> <?php $res = ob_get_contents(); ob_end_clean(); return $res; }  public function Suspend($id, $do = "") { $this->loadOptions($id);  $res = $this->Call($do . "suspendacct", [ "user" => "web$id", ]);  if ($res->metadata->result) { return [true]; } else { return [false, $res->metadata->reason]; } }  public function Unsuspend($id) { return $this->Suspend($id, "un"); }  public function ChangePackage($id) { $this->loadOptions($id);  $res = $this->Call("changepackage", [ "user" => "web$id", "pkg" => $this->getOption("plan"), ]);  if ($res->metadata->result) { return [true]; } else { return [false, $res->metadata->reason]; } }  public function AllEmailVariables() { return Array( "url", ); }  public function EmailVariables($id) { global $raw_cfg; $this->loadOptions($id); $u = $this->getClient($id);  return Array( "url" => $raw_cfg['PAGEURL'] . "/hosting/" . $id, ); }}</source>