Änderungen

Wechseln zu: Navigation, Suche

Server-Module erstellen

11.272 Byte hinzugefügt, 21:30, 8. Nov. 2019
== 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>