http://modulesgarden.com * CONTACT -> contact@modulesgarden.com * * * This software is furnished under a license and may be used and copied * only in accordance with the terms of such license and with the * inclusion of the above copyright notice. This software or any other * copies thereof may not be provided or otherwise made available to any * other person. No title to and ownership of the software is hereby * transferred. * * * ******************************************************************** */ namespace ModulesGarden\ProxmoxAddon\App\UI\VmCleaner\Pages; use MGProvision\Proxmox\v2 as proxmox; use ModulesGarden\ProxmoxAddon as main; use ModulesGarden\ProxmoxAddon\App\UI\VmCleaner\Buttons\DeleteButton; use ModulesGarden\ProxmoxAddon\App\UI\VmCleaner\Buttons\DeleteMassButton; use ModulesGarden\ProxmoxAddon\Core\Helper; use ModulesGarden\ProxmoxAddon\Core\UI\Interfaces\AdminArea; use ModulesGarden\ProxmoxAddon\Core\UI\Widget\DataTable\Column; use ModulesGarden\ProxmoxAddon\Core\UI\Widget\RawDataTable\RawDataTable; use WHMCS\Database\Capsule; use WHMCS\Service\Service; use function ModulesGarden\ProxmoxAddon\Core\Helper\sl; use Illuminate\Database\Capsule\Manager as DB; /** * Description of PluginInstalled * * @author Pawel Kopec */ class VmCleanerDataTable extends RawDataTable implements AdminArea { use main\App\Services\BaseService; protected $id = 'vmCleaner'; protected $name = 'vmCleaner'; protected $title = 'vmCleanerTitle'; private $proxmoxCloudTable; public function isRawTitle() { return false; } public function initContent() { $this->addActionButton(new DeleteButton); $this->addMassActionButton(new DeleteMassButton); try { $this->setServerId($this->getRequestValue('id'))->getApi(); } catch (\Exception $ex) { $this->setInternalAlertMessage($ex->getMessage()) ->setInternalAlertMessageType('danger'); } } public function replaceFieldVirtualization($key, $row) { return Helper\sl('lang')->absoluteT($row['type']); } public function replaceFieldStatus($key, $row) { switch ($row['status']) { case 'stopped': return '' . sl('lang')->tr($row['status']) . ''; case 'running': return '' . sl('lang')->tr($row['status']) . ''; break; case 'unknown': return '' . sl('lang')->tr($row['status']) . ''; break; case 'io-error': return '' . sl('lang')->tr($row['status']) . ''; break; default: return '' . sl('lang')->tr($row['status']) . ''; } } protected function loadHtml() { $this->addColumn((new Column('node'))->setSearchable(true, Column::TYPE_STRING)->setOrderable('ASC')) ->addColumn((new Column('vmid'))->setSearchable(true, Column::TYPE_STRING)->setOrderable()) ->addColumn((new Column('name'))->setSearchable(true, Column::TYPE_STRING)->setOrderable()) ->addColumn((new Column('virtualization'))->setSearchable(true, Column::TYPE_STRING)->setOrderable()) ->addColumn((new Column('status'))->setSearchable(true, Column::TYPE_STRING)->setOrderable()); } protected function loadData() { session_write_close(); $this->setServerId($this->getRequestValue('id'))->getApi()->setInstance(); $dataProv = new main\Core\UI\Widget\DataTable\DataProviders\Providers\ArrayDataProvider(); $data = []; $clusterRepository = new proxmox\repository\ClusterResourcesRepository(); $this->proxmoxCloudVpsTable = Capsule::schema()->hasTable('ProxmoxAddon_Vm'); foreach ($clusterRepository->fetch() as $resurce) { if (!in_array($resurce->getType(), ['qemu', 'lxc']) || $resurce->getTemplate() == '1' || $resurce->getStatus() == "unknown" || $this->exist($resurce)) { continue; } $data[] = array_merge($resurce->toArray(), ["id" => base64_encode(json_encode($resurce->toArray()))]); } $dataProv->setDefaultSorting("node", 'ASC'); $dataProv->setData((array)$data); $this->setDataProvider($dataProv); } private function exist(proxmox\models\ClusterResource $resurce) { //cloud if ($this->proxmoxCloudVpsTable) { if (Capsule::table('ProxmoxAddon_Vm')->where("vmid", $resurce->getVmid())->where("node", $resurce->getNode())->count()) { return true; } } //vps $h = 'tblhosting'; $fv = "tblcustomfieldsvalues"; $f = "tblcustomfields"; $query = main\App\Models\Whmcs\Hosting::rightJoin($fv, "{$fv}.relid", "=","{$h}.id") ->rightJoin($f, "{$f}.id", "=","{$fv}.fieldid") ->where("{$h}.server", $this->getServerId()) ->whereIn("{$h}.domainstatus", ["Active", "Suspended"]) ->where("{$f}.type", "product") ->where("{$f}.fieldname", "LIKE", "%vmid") ->where("{$fv}.value", $resurce->getVmid()); return $query->count() > 0; } }