ConfigOptions.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <?php
  2. namespace ModulesGarden\Servers\ProxmoxCloudVps\Core\App\Controllers\Instances\Addon;
  3. use ModulesGarden\Servers\ProxmoxCloudVps\Core\App\Controllers\ResponseResolver;
  4. use ModulesGarden\Servers\ProxmoxCloudVps\Core\App\Installer\ModuleInstaller;
  5. use ModulesGarden\Servers\ProxmoxCloudVps\Core\Http\JsonResponse;
  6. use ModulesGarden\Servers\ProxmoxCloudVps\Core\Models\Whmcs\Product;
  7. use ModulesGarden\Servers\ProxmoxCloudVps\Core\Models\Whmcs\Server;
  8. use ModulesGarden\Servers\ProxmoxCloudVps\Core\ModuleConstants;
  9. use ModulesGarden\Servers\ProxmoxCloudVps\Core\ServiceLocator;
  10. use ModulesGarden\Servers\ProxmoxCloudVps\Core\Traits\AppParams;
  11. use ModulesGarden\Servers\ProxmoxCloudVps\Core\Traits\OutputBuffer;
  12. use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Traits\RequestObjectHandler;
  13. /**
  14. * ConfigOptions module actions
  15. */
  16. class ConfigOptions extends \ModulesGarden\Servers\ProxmoxCloudVps\Core\App\Controllers\Instances\AddonController
  17. {
  18. use AppParams;
  19. use RequestObjectHandler;
  20. use OutputBuffer;
  21. public function execute($params = null)
  22. {
  23. $productId = $this->getRequestValue('id');
  24. if (($this->getRequestValue('action') === 'module-settings' || ($this->getRequestValue('loadData') && $this->getRequestValue('ajax') == '1')))
  25. {
  26. try
  27. {
  28. //check storage
  29. $invalidStoragePermissions = $this->getInvalidStoragePermitions();
  30. if ($invalidStoragePermissions)
  31. {
  32. return $this->getInvalidStoragePermissionsError($invalidStoragePermissions);
  33. }
  34. //check server type
  35. if (!$this->isCorrectServerType())
  36. {
  37. return $this->getInvalidServerTypeError();
  38. }
  39. $requirementsHandler = new \ModulesGarden\Servers\ProxmoxCloudVps\Core\App\Requirements\Checker();
  40. if ($requirementsHandler->getUnfulfilledRequirements())
  41. {
  42. $data = $this->buildErrorMessage(implode('<br>', $requirementsHandler->getUnfulfilledRequirements()));
  43. return $this->returnAjaxResponse($data);
  44. }
  45. $this->updateProductType();
  46. $this->addRequiredCustomFields();
  47. //run installer
  48. $installer = new ModuleInstaller();
  49. $installer->makeInstall();
  50. if (!$installer->isInstallCorrect())
  51. {
  52. return $this->buildFailedQueriesMessage($installer->getFailedQueries());
  53. }
  54. }
  55. catch (\Excpetion $exc)
  56. {
  57. $data = $this->buildErrorMessage($exc->getMessage());
  58. return $this->returnAjaxResponse($data);
  59. }
  60. try
  61. {
  62. $this->setAppParam('IntegrationControlerName', \ModulesGarden\Servers\ProxmoxCloudVps\App\Http\Actions\ConfigOptions::class);
  63. $this->setAppParam('IntegrationControlerMethod', 'runExecuteProcess');
  64. $configOptionsController = new \ModulesGarden\Servers\ProxmoxCloudVps\App\Http\Actions\ConfigOptions();
  65. $result = $configOptionsController->execute();
  66. return $result;
  67. }
  68. catch (\Exception $exc)
  69. {
  70. $data = $this->buildErrorMessage($exc->getMessage());
  71. $response = new JsonResponse();
  72. $response->setData($data);
  73. $resolver = new ResponseResolver($response);
  74. $resolver->resolve();
  75. }
  76. }
  77. else if ($this->getRequestValue('action') === 'save')
  78. {
  79. if (!$this->isCorrectServerType())
  80. {
  81. return [];
  82. }
  83. return [\ModulesGarden\Servers\ProxmoxCloudVps\App\Http\Actions\ConfigOptions::class, 'runExecuteProcess'];
  84. }
  85. return [];
  86. }
  87. /**
  88. * Catch errors during form creation
  89. * @param null $params
  90. * @return \ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\type
  91. */
  92. public function runExecuteProcess($params = null)
  93. {
  94. try
  95. {
  96. return parent::runExecuteProcess($params);;
  97. }
  98. catch(\Exception $exc)
  99. {
  100. $data = $this->buildErrorMessage($exc->getMessage());
  101. $response = new JsonResponse();
  102. $response->setData($data);
  103. $resolver = new ResponseResolver($response);
  104. $resolver->resolve();
  105. }
  106. }
  107. public function getInvalidStoragePermitions()
  108. {
  109. $requiredPaths = [
  110. ModuleConstants::getFullPath('storage'),
  111. ModuleConstants::getFullPath('storage', 'app'),
  112. ModuleConstants::getFullPath('storage', 'crons'),
  113. ModuleConstants::getFullPath('storage', 'logs')
  114. ];
  115. $invalidPermissions = [];
  116. $lang = ServiceLocator::call('lang');
  117. foreach ($requiredPaths as $path)
  118. {
  119. if (!is_writable($path))
  120. {
  121. $invalidPermissions[] = $lang->addReplacementConstant('storage_path', $path)->absoluteT('permissionsStorage');
  122. }
  123. if (!is_readable($path))
  124. {
  125. $invalidPermissions[] = $lang->addReplacementConstant('storage_path', $path)->absoluteT('permissionsStorageReadable');
  126. }
  127. }
  128. return $invalidPermissions;
  129. }
  130. public function buildFailedQueriesMessage($failedQueries = [])
  131. {
  132. $content = '';
  133. foreach ($failedQueries as $query)
  134. {
  135. $content .= '<div class="panel panel-danger"><div class="panel-heading">Installation Error</div><div class="panel-body" style="padding:0px;"><ul class="list-group" style="margin-bottom: -5px;margin-top: -5px;">';
  136. //$content .= '<li class="list-group-item ">Status: ' . $query['status'] . '</li>';
  137. $content .= '<li class="list-group-item ">File: ' . $query['file'] . '</li>';
  138. $content .= '<li class="list-group-item ">Error Message: ' . $query['errorMessage'] . '</li>';
  139. $content .= '<li class="list-group-item ">Raw Query: ' . $query['rawQuery'] . '</li>';
  140. $content .= '</ul></div></div>';
  141. }
  142. $data = [
  143. 'content' =>
  144. '<tr><td class="fieldlabel" style="width:0%; display:none;"></td><td style="width=100%;" class="fieldarea">' . $content . '</td></tr>',
  145. 'mode' => 'advanced'
  146. ];
  147. return $this->returnAjaxResponse($data);
  148. }
  149. public function getInvalidStoragePermissionsError($permissions = [])
  150. {
  151. $data = $this->buildErrorMessage(implode('<br>', $permissions));
  152. return $this->returnAjaxResponse($data);
  153. }
  154. public function isCorrectServerType()
  155. {
  156. try
  157. {
  158. if (class_exists('\ModulesGarden\Servers\ProxmoxCloudVps\App\Http\Actions\MetaData'))
  159. {
  160. $metaDataController = new \ModulesGarden\Servers\ProxmoxCloudVps\App\Http\Actions\MetaData();
  161. $details = $metaDataController->execute(null);
  162. if ($details['RequiresServer'] !== true)
  163. {
  164. return true;
  165. }
  166. $serverGroupId = $this->getServerGroupId();
  167. $sModel = new Server();
  168. $server = $sModel
  169. ->select(['tblservers.type'])
  170. ->join('tblservergroupsrel', 'tblservergroupsrel.serverid', '=', 'tblservers.id')
  171. ->where('tblservergroupsrel.groupid', $serverGroupId)->first();
  172. if (!$server)
  173. {
  174. return false;
  175. }
  176. if ($server->type !== $this->getModuleName())
  177. {
  178. return false;
  179. }
  180. }
  181. }
  182. catch (\Exception $exception)
  183. {
  184. //todo log me
  185. return false;
  186. }
  187. return true;
  188. }
  189. public function getServerGroupId()
  190. {
  191. $gid = $this->getRequestValue('servergroup', false);
  192. if (!$gid && $gid !== '0' && $gid !== 0)
  193. {
  194. $pid = $this->getRequestValue('id', 0);
  195. $productModel = new Product();
  196. $product = $productModel->where('id', $pid)->first();
  197. if (!$product)
  198. {
  199. //can add first product here if needed
  200. return 0;
  201. }
  202. return $product->servergroup;
  203. }
  204. return (int)$gid;
  205. }
  206. public function getInvalidServerTypeError()
  207. {
  208. $lang = ServiceLocator::call('lang');
  209. $messaage = $lang->addReplacementConstant('provisioning_name', $this->getModuleDisplayName())->absoluteT('invalidServerType');
  210. $data = $this->buildErrorMessage($messaage);
  211. return $this->returnAjaxResponse($data);
  212. }
  213. public function buildErrorMessage($message)
  214. {
  215. $data = [
  216. 'content' =>
  217. '<tr><td class="fieldlabel" style="width:0%; display:none;"></td><td style="width=100%;" class="fieldarea"><div style="width=100%; margin-bottom: 0px;" class="alert alert-danger">' . $message . '</div></td></tr>',
  218. 'mode' => 'advanced'
  219. ];
  220. return $data;
  221. }
  222. public function returnAjaxResponse($data = [])
  223. {
  224. $response = new JsonResponse();
  225. $response->setData($data);
  226. return $response;
  227. }
  228. public function updateProductType()
  229. {
  230. if ($this->getRequestValue('action') !== 'module-settings'
  231. || $this->getAppParam('moduleAppType') !== 'server')
  232. {
  233. return false;
  234. }
  235. $moduleName = $this->getAppParam('systemName');
  236. $pid = $this->getRequestValue('id', false);
  237. $servergroup = $this->getRequestValue('servergroup', 0);
  238. if ($pid && $servergroup > 0)
  239. {
  240. $product = new Product();
  241. $product->where('id', $pid)->update(['servertype' => $moduleName, 'servergroup' => $servergroup]);
  242. }
  243. }
  244. public function getModuleName()
  245. {
  246. return $this->getAppParam('systemName');
  247. }
  248. public function getModuleDisplayName()
  249. {
  250. return $this->getAppParam('name');
  251. }
  252. public function addRequiredCustomFields()
  253. {
  254. $pid = $this->getRequestValue('id', false);
  255. if ($pid === false)
  256. {
  257. return;
  258. }
  259. $product = new \ModulesGarden\Servers\ProxmoxCloudVps\Packages\WhmcsService\Product($pid);
  260. $product->createCustomFieldsFromConfig();
  261. }
  262. }