WhmcsService.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. <?php
  2. namespace ModulesGarden\Servers\ProxmoxVps\App\Config\Packages;
  3. use MGProvision\Proxmox\v2\ProxmoxApiException;
  4. use MGProvision\Proxmox\v2\repository\ClusterResourcesRepository;
  5. use MGProvision\Proxmox\v2\repository\FileRepository;
  6. use MGProvision\Proxmox\v2\repository\NodeRepository;
  7. use MGProvision\Proxmox\v2\repository\StorageRepository;
  8. use ModulesGarden\ProxmoxAddon\App\Enum\Vps\ConfigurableOption;
  9. use ModulesGarden\ProxmoxAddon\App\Helper\VmidHelper;
  10. use ModulesGarden\ProxmoxAddon\App\Models\CloudInitScript;
  11. use ModulesGarden\ProxmoxAddon\App\Models\IpAddress;
  12. use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
  13. use ModulesGarden\ProxmoxAddon\App\Services\Vps\ProductService;
  14. use ModulesGarden\Servers\ProxmoxVps\App\Libs\AwsIntegration\ClientWrapper;
  15. use ModulesGarden\Servers\ProxmoxVps\App\Models\AvailableImages\Repository;
  16. use ModulesGarden\Servers\ProxmoxVps\App\UI\Admin\ProductConfig\Providers\Config;
  17. use ModulesGarden\Servers\ProxmoxVps\Core\App\Packages\AppPackageConfiguration;
  18. use ModulesGarden\Servers\ProxmoxVps\Core\FileReader\Reader\Json;
  19. use ModulesGarden\Servers\ProxmoxVps\Core\ModuleConstants;
  20. use ModulesGarden\Servers\ProxmoxVps\Core\UI\Traits\RequestObjectHandler;
  21. use ModulesGarden\Servers\ProxmoxVps\Core\UI\Traits\WhmcsParams;
  22. use ModulesGarden\Servers\ProxmoxVps\Packages\WhmcsService\Config\Enum;
  23. class WhmcsService extends AppPackageConfiguration
  24. {
  25. use RequestObjectHandler;
  26. use WhmcsParams;
  27. use ProductService;
  28. use ApiService;
  29. use VmidHelper;
  30. const APP_CONFIGURATION =
  31. [
  32. self::PACKAGE_STATUS => self::PACKAGE_STATUS_ACTIVE,
  33. Enum::CUSTOM_FIELDS => [
  34. [
  35. Enum::FIELD_NAME => 'vmid|VMID',
  36. Enum::FIELD_TYPE => Enum::FIELD_TYPE_TEXT_BOX,
  37. Enum::FIELD_ADMIN_ONLY => Enum::FIELD_ADMIN_ONLY_ON
  38. ],
  39. [
  40. Enum::FIELD_NAME => 'node|Node',
  41. Enum::FIELD_TYPE => Enum::FIELD_TYPE_TEXT_BOX,
  42. Enum::FIELD_ADMIN_ONLY => Enum::FIELD_ADMIN_ONLY_ON
  43. ],
  44. [
  45. Enum::FIELD_NAME => 'VLAN Tag|VLAN Tag',
  46. Enum::FIELD_TYPE => Enum::FIELD_TYPE_TEXT_BOX,
  47. Enum::FIELD_ADMIN_ONLY => Enum::FIELD_ADMIN_ONLY_ON
  48. ],
  49. [
  50. Enum::FIELD_NAME => 'userName|Username',
  51. Enum::FIELD_TYPE => Enum::FIELD_TYPE_TEXT_BOX,
  52. Enum::FIELD_ADMIN_ONLY => Enum::FIELD_ADMIN_ONLY_ON
  53. ],
  54. [
  55. Enum::FIELD_NAME => 'ciuser|Cloud-Init User',
  56. Enum::FIELD_TYPE => Enum::FIELD_TYPE_TEXT_BOX,
  57. Enum::FIELD_ADMIN_ONLY => Enum::FIELD_ADMIN_ONLY_ON
  58. ],
  59. [
  60. Enum::FIELD_NAME => 'cipassword|Cloud-Init Password',
  61. Enum::FIELD_TYPE => Enum::FIELD_TYPE_PASSWORD,
  62. Enum::FIELD_ADMIN_ONLY => Enum::FIELD_ADMIN_ONLY_OFF,
  63. ],
  64. [
  65. Enum::FIELD_NAME => 'sshkeys|SSH Public Key',
  66. Enum::FIELD_TYPE => Enum::FIELD_TYPE_TEXTAREA,
  67. Enum::FIELD_ADMIN_ONLY => Enum::FIELD_ADMIN_ONLY_ON,
  68. Enum::FIELD_REG_EXPR => '#ssh-rsa AAAA[0-9A-Za-z+/]+[=]{0,3}( [^@]+@[^@]+)?#',
  69. Enum::FIELD_SHOW_ORDER => Enum::FIELD_SHOW_ORDER_ON,
  70. Enum::FIELD_DESCRIPTION => 'Enter your public key in the OpenSSH format here (e.g. ssh-rsa).'
  71. ]
  72. ],
  73. ];
  74. public function VMTemplateGetSubOptions()
  75. {
  76. $subOptions = [];
  77. try
  78. {
  79. //kvm
  80. if ($this->configuration()->isQemu())
  81. {
  82. $subOptions[] = [
  83. Enum::OPTION_SUB_NAME => '0|Disabled',
  84. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  85. ];
  86. $clusterResourcesRepository = new ClusterResourcesRepository();
  87. $clusterResourcesRepository->setApi($this->api());
  88. $clusterResourcesRepository->findKvmTemplate();
  89. $templates = [];
  90. foreach ($clusterResourcesRepository->fetch() as $resurce)
  91. {
  92. if (preg_match('/^custom[0-9]*/', $resurce->getName()))
  93. {
  94. continue;
  95. }
  96. if (in_array($resurce->getName(), $templates))
  97. {
  98. continue;
  99. }
  100. $subOptions[] = [
  101. Enum::OPTION_SUB_NAME => $resurce->getName() . '|' . $resurce->getName(),
  102. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  103. ];
  104. }
  105. unset($templates);
  106. }
  107. else
  108. {
  109. if ($this->configuration()->isLxc())
  110. { //lxc
  111. $subOptions[] = [
  112. Enum::OPTION_SUB_NAME => '0|None',
  113. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  114. ];
  115. //node
  116. $node = $this->getDefaultNode();
  117. //storages
  118. $storageRepository = new StorageRepository();
  119. $storageRepository->findByNodes([$node->getNode()])
  120. ->findEnabed();
  121. //osTemplates
  122. $fileRepository = new FileRepository();
  123. $fileRepository->setApi($this->api());
  124. $fileRepository->findLxcTemplates();
  125. $fileRepository->findByNode($node);
  126. $fileRepository->findByStorages($storageRepository->fetchAsArray());
  127. foreach ($fileRepository->fetch() as $file)
  128. {
  129. $subOptions[] = [
  130. Enum::OPTION_SUB_NAME => $file->getVolid() . '|' . $file->getFriendlyName(),
  131. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  132. ];
  133. }
  134. }
  135. }
  136. }
  137. catch (ProxmoxApiException $ex)
  138. {
  139. return $subOptions;
  140. }
  141. return $subOptions;
  142. }
  143. public function NetworkRateGetSubOptions()
  144. {
  145. return [
  146. [
  147. Enum::OPTION_SUB_NAME => "0|Unlimited",
  148. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  149. ],
  150. [
  151. Enum::OPTION_SUB_NAME => '5|5 (MB/s) (' . (5 * 8) . ' Mbps)',
  152. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  153. ],
  154. [
  155. Enum::OPTION_SUB_NAME => '10|10 (MB/s) (' . (10 * 8) . ' Mbps)',
  156. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  157. ],
  158. [
  159. Enum::OPTION_SUB_NAME => '20|20 (MB/s) (' . (20 * 8) . ' Mbps)',
  160. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  161. ],
  162. [
  163. Enum::OPTION_SUB_NAME => '30|30 (MB/s) (' . (30 * 8) . ' Mbps)',
  164. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  165. ],
  166. [
  167. Enum::OPTION_SUB_NAME => '40|40 (MB/s) (' . (40 * 8) . ' Mbps)',
  168. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  169. ],
  170. [
  171. Enum::OPTION_SUB_NAME => '50|50 (MB/s) (' . (50 * 8) . ' Mbps)',
  172. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  173. ],
  174. ];
  175. }
  176. public function vcpusGetSubOptions()
  177. {
  178. return [
  179. [
  180. Enum::OPTION_SUB_NAME => "0|Unlimited",
  181. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  182. ],
  183. [
  184. Enum::OPTION_SUB_NAME => '1|1',
  185. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  186. ]
  187. ];
  188. }
  189. public function ISOImageGetSubOptions()
  190. {
  191. $subOptions = [
  192. [
  193. Enum::OPTION_SUB_NAME => 'none|None',
  194. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  195. ]
  196. ];
  197. try
  198. {
  199. //node
  200. $node = $this->getDefaultNode();
  201. //storages
  202. $storageRepository = new StorageRepository();
  203. $storageRepository->findByNodes([$node->getNode()])
  204. ->findEnabed();
  205. //file repository
  206. $fileRepository = new FileRepository();
  207. $fileRepository->setApi($this->api());
  208. $fileRepository->findIso();
  209. $fileRepository->findByNode($node);
  210. $fileRepository->findByStorages($storageRepository->fetchAsArray());
  211. foreach ($fileRepository->fetch() as $file)
  212. {
  213. $subOptions[] = [
  214. Enum::OPTION_SUB_NAME => $file->getVolid() . '|' . $file->getFriendlyName(),
  215. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  216. ];
  217. }
  218. }
  219. catch (ProxmoxApiException $ex)
  220. {
  221. return $subOptions;
  222. }
  223. return $subOptions;
  224. }
  225. public function osTypeGetSubOptions()
  226. {
  227. $subOptions = [];
  228. $ostype = new Json('ostype.json', ModuleConstants::getFullPathWhmcs('modules', 'addons', 'proxmoxAddon', 'storage', 'app'));
  229. foreach ($ostype->get() as $k => $ostype)
  230. {
  231. $subOptions[] = [
  232. Enum::OPTION_SUB_NAME => $k . '|' . $ostype,
  233. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  234. ];
  235. }
  236. return $subOptions;
  237. }
  238. public function getConfigurableOptions()
  239. {
  240. $configOptions = [];
  241. if ($this->configuration()->isQemu())
  242. {
  243. $configOptions[] = [
  244. Enum::OPTION_NAME => 'The number of CPU sockets|CPU Sockets',
  245. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  246. Enum::OPTION_QUANTITY_MIN => 1,
  247. Enum::OPTION_QUANTITY_MAX => 100,
  248. Enum::CONFIG_SUB_OPTIONS => [
  249. [
  250. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  251. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  252. ]
  253. ]
  254. ];
  255. $configOptions[] = [
  256. Enum::OPTION_NAME => 'The number of cores per socket|CPU Cores',
  257. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  258. Enum::OPTION_QUANTITY_MIN => 1,
  259. Enum::OPTION_QUANTITY_MAX => 10,
  260. Enum::CONFIG_SUB_OPTIONS => [
  261. [
  262. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  263. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  264. ]
  265. ]
  266. ];
  267. }
  268. if ($this->configuration()->isLxc())
  269. {
  270. $configOptions[] = [
  271. Enum::OPTION_NAME => 'cores|CPU Cores',
  272. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  273. Enum::OPTION_QUANTITY_MIN => 1,
  274. Enum::OPTION_QUANTITY_MAX => 10,
  275. Enum::CONFIG_SUB_OPTIONS => [
  276. [
  277. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  278. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  279. ]
  280. ]
  281. ];
  282. }
  283. $configOptions[] = [
  284. Enum::OPTION_NAME => 'cpulimit|Limit Of CPU',
  285. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  286. Enum::OPTION_QUANTITY_MIN => 0,
  287. Enum::OPTION_QUANTITY_MAX => 100,
  288. Enum::CONFIG_SUB_OPTIONS => [
  289. [
  290. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  291. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  292. ]
  293. ]
  294. ];
  295. $configOptions[] = [
  296. Enum::OPTION_NAME => 'CPU weight for a VM|CPU Weight For The VM',
  297. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  298. Enum::OPTION_QUANTITY_MIN => 1024,
  299. Enum::OPTION_QUANTITY_MAX => 99999,
  300. Enum::CONFIG_SUB_OPTIONS => [
  301. [
  302. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  303. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  304. ]
  305. ]
  306. ];
  307. $unit = strtoupper($this->configuration()->getMemoryUnit());
  308. $min = 128;
  309. $max = 1024 * 10;
  310. if ($this->configuration()->getMemoryUnit() == 'gb')
  311. {
  312. $min = 1;
  313. $max = 10;
  314. }
  315. $configOptions[] = [
  316. Enum::OPTION_NAME => 'Amount of RAM|Amount Of RAM',
  317. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  318. Enum::OPTION_QUANTITY_MIN => $min,
  319. Enum::OPTION_QUANTITY_MAX => $max,
  320. Enum::CONFIG_SUB_OPTIONS => [
  321. [
  322. Enum::OPTION_SUB_NAME => "{$unit}|{$unit}",
  323. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  324. ]
  325. ]
  326. ];
  327. if ($this->configuration()->isLxc())
  328. {
  329. $unit = strtoupper($this->configuration()->getSwapUnit());
  330. $min = 128;
  331. $max = 1024 * 10;
  332. if ($this->configuration()->getSwapUnit() == 'gb')
  333. {
  334. $min = 1;
  335. $max = 10;
  336. }
  337. $configOptions[] = [
  338. Enum::OPTION_NAME => 'Amount of SWAP|Amount Of SWAP',
  339. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  340. Enum::OPTION_QUANTITY_MIN => $min,
  341. Enum::OPTION_QUANTITY_MAX => $max,
  342. Enum::CONFIG_SUB_OPTIONS => [
  343. [
  344. Enum::OPTION_SUB_NAME => "{$unit}|{$unit}",
  345. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  346. ]
  347. ]
  348. ];
  349. }
  350. $unit = strtoupper($this->configuration()->getDiskUnit());
  351. $min = 128;
  352. $max = 1024 * 1000;
  353. if ($this->configuration()->getDiskUnit() == 'gb' || $this->configuration()->getDiskUnit() == 'tb')
  354. {
  355. $min = 1;
  356. $max = 1000;
  357. }
  358. $configOptions[] = [
  359. Enum::OPTION_NAME => 'Disk Space|Disk Space',
  360. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  361. Enum::OPTION_QUANTITY_MIN => $min,
  362. Enum::OPTION_QUANTITY_MAX => $max,
  363. Enum::CONFIG_SUB_OPTIONS => [
  364. [
  365. Enum::OPTION_SUB_NAME => "{$unit}|{$unit}",
  366. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  367. ]
  368. ]
  369. ];
  370. $unit = strtoupper($this->configuration()->getAdditionalDiskUnit());
  371. $max = 1024 * 1000;
  372. if ($this->configuration()->getAdditionalDiskUnit() == 'gb' || $this->configuration()->getAdditionalDiskUnit() == 'tb')
  373. {
  374. $max = 1000;
  375. }
  376. $configOptions[] = [
  377. Enum::OPTION_NAME => 'additionalDisksSpace|Additional Disks Space',
  378. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  379. Enum::OPTION_QUANTITY_MIN => 0,
  380. Enum::OPTION_QUANTITY_MAX => $max,
  381. Enum::CONFIG_SUB_OPTIONS => [
  382. [
  383. Enum::OPTION_SUB_NAME => "{$unit}|{$unit}",
  384. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  385. ]
  386. ]
  387. ];
  388. $configOptions[] = [
  389. Enum::OPTION_NAME => 'IP Addresses|IPv4 Addresses',
  390. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  391. Enum::OPTION_QUANTITY_MIN => 0,
  392. Enum::OPTION_QUANTITY_MAX => 100,
  393. Enum::CONFIG_SUB_OPTIONS => [
  394. [
  395. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  396. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  397. ]
  398. ]
  399. ];
  400. $configOptions[] = [
  401. Enum::OPTION_NAME => 'IPv6 Addresses|IPv6 Addresses',
  402. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  403. Enum::OPTION_QUANTITY_MIN => 0,
  404. Enum::OPTION_QUANTITY_MAX => 100,
  405. Enum::CONFIG_SUB_OPTIONS => [
  406. [
  407. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  408. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  409. ]
  410. ]
  411. ];
  412. $configOptions[] = [
  413. Enum::OPTION_NAME => 'Backups Limit|Backups Size',
  414. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  415. Enum::OPTION_QUANTITY_MIN => 0,
  416. Enum::OPTION_QUANTITY_MAX => 10 * 100,
  417. Enum::CONFIG_SUB_OPTIONS => [
  418. [
  419. Enum::OPTION_SUB_NAME => 'GB|GB',
  420. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  421. ]
  422. ]
  423. ];
  424. $configOptions[] = [
  425. Enum::OPTION_NAME => 'Backups Files Limit|Backup Files',
  426. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  427. Enum::OPTION_QUANTITY_MIN => 0,
  428. Enum::OPTION_QUANTITY_MAX => 100,
  429. Enum::CONFIG_SUB_OPTIONS => [
  430. [
  431. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  432. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  433. ]
  434. ]
  435. ];
  436. $configOptions[] = [
  437. Enum::OPTION_NAME => 'snapshots|Snapshots',
  438. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  439. Enum::OPTION_QUANTITY_MIN => 0,
  440. Enum::OPTION_QUANTITY_MAX => 100,
  441. Enum::CONFIG_SUB_OPTIONS => [
  442. [
  443. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  444. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  445. ]
  446. ]
  447. ];
  448. $configOptions[] = [
  449. Enum::OPTION_NAME => 'snapshotJobs|Snapshot Jobs',
  450. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  451. Enum::OPTION_QUANTITY_MIN => 0,
  452. Enum::OPTION_QUANTITY_MAX => 100,
  453. Enum::CONFIG_SUB_OPTIONS => [
  454. [
  455. Enum::OPTION_SUB_NAME => 'Unit|Unit',
  456. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  457. ]
  458. ]
  459. ];
  460. $configOptions[] = [
  461. Enum::OPTION_NAME => 'Bandwidth|Bandwidth',
  462. Enum::OPTION_TYPE => Enum::OPTION_TYPE_QUANTITY,
  463. Enum::OPTION_QUANTITY_MIN => 0,
  464. Enum::OPTION_QUANTITY_MAX => 10 * 100,
  465. Enum::CONFIG_SUB_OPTIONS => [
  466. [
  467. Enum::OPTION_SUB_NAME => 'GB|GB',
  468. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  469. ]
  470. ]
  471. ];
  472. $configOptions[] = [
  473. Enum::OPTION_NAME => 'VM Template|VM Template',
  474. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  475. ];
  476. $configOptions[] = [
  477. Enum::OPTION_NAME => ConfigurableOption::ARCHIVE.'|Archive',
  478. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  479. ];
  480. $configOptions[] = [
  481. Enum::OPTION_NAME => 'Network Rate|Network Rate',
  482. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  483. ];
  484. if ($this->configuration()->isQemu())
  485. {
  486. $configOptions[] = [
  487. Enum::OPTION_NAME => 'vcpus|VCPUs',
  488. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  489. ];
  490. $configOptions[] = [
  491. Enum::OPTION_NAME => 'ISO Image|ISO Image',
  492. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  493. ];
  494. $configOptions[] = [
  495. Enum::OPTION_NAME => 'osType|OS Type',
  496. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  497. ];
  498. $configOptions[] = [
  499. Enum::OPTION_NAME => 'cicustom|Custom Cloud-Init Configuration',
  500. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  501. ];
  502. $configOptions[] = [
  503. Enum::OPTION_NAME => 'ciscript|Cloud-Init Script',
  504. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  505. ];
  506. }
  507. $configOptions[] = [
  508. Enum::OPTION_NAME => 'tag|Tag',
  509. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  510. Enum::HIDDEN => 1
  511. ];
  512. $configOptions[] = [
  513. Enum::OPTION_NAME => ConfigurableOption::STORAGE.'|Storage Disk Space',
  514. Enum::OPTION_TYPE => Enum::OPTION_TYPE_DROPDOWN,
  515. ];
  516. return $configOptions;
  517. }
  518. public function ciscriptGetSubOptions()
  519. {
  520. $subOptions = [];
  521. //kvm
  522. if ($this->configuration()->isQemu())
  523. {
  524. $subOptions[] = [
  525. Enum::OPTION_SUB_NAME => '0|Disabled',
  526. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  527. ];
  528. foreach (CloudInitScript::get() as $item){
  529. $subOptions[] = [
  530. Enum::OPTION_SUB_NAME => $item->id . '|' . $item->name,
  531. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  532. ];
  533. }
  534. }
  535. return $subOptions;
  536. }
  537. public function tagGetSubOptions()
  538. {
  539. $subOptions = [];
  540. $subOptions[] = [
  541. Enum::OPTION_SUB_NAME => '0|Disabled',
  542. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  543. ];
  544. foreach (IpAddress::select("tag")->whereNotNull("tag")->where("tag", ">", 0)->groupBy("tag")->pluck("tag")->all() as $tag) {
  545. $subOptions[] = [
  546. Enum::OPTION_SUB_NAME => sprintf("%s|%s",$tag,$tag),
  547. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  548. ];
  549. }
  550. return $subOptions;
  551. }
  552. public function archiveGetSubOptions()
  553. {
  554. $subOptions = [];
  555. try
  556. {
  557. //node
  558. $node = $this->getDefaultNode();
  559. //storages
  560. $storageRepository = new StorageRepository();
  561. $storageRepository->findByNodes([$node->getNode()])
  562. ->findEnabed();
  563. //nodes
  564. $nodeRepository = new NodeRepository();
  565. $nodeRepository->setApi($this->api());
  566. $nodeRepository->findOnline(true);
  567. //archive
  568. $fileRepository = new FileRepository();
  569. $fileRepository->setApi($this->api());
  570. //each node
  571. $fileRepository->findByNodes($nodeRepository->fetchArray());
  572. //each storage
  573. $fileRepository->findByStorages($storageRepository->fetchAsArray());
  574. $subOptions[] = [
  575. Enum::OPTION_SUB_NAME => '0|None',
  576. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  577. ];
  578. //kvm
  579. if ($this->configuration()->isLxc())
  580. {
  581. $fileRepository->findBackupLxcTemplates();
  582. }else{
  583. $fileRepository->findBackupQemuTemplates();
  584. }
  585. foreach ($fileRepository->fetch() as $file)
  586. {
  587. if($this->vmidExistInWhmcs($file->getVmid())){
  588. continue;
  589. }
  590. $subOptions[] = [
  591. Enum::OPTION_SUB_NAME => sprintf("%s:%s|%s",$file->getNode(),$file->getVolid(),$file->formatVolid()),
  592. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  593. ];
  594. }
  595. return $subOptions;
  596. }
  597. catch (ProxmoxApiException $ex)
  598. {
  599. return $subOptions;
  600. }
  601. }
  602. public function storageGetSubOptions()
  603. {
  604. $subOptions = [];
  605. try
  606. {
  607. $subOptions[] = [
  608. Enum::OPTION_SUB_NAME => '0|None',
  609. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  610. ];
  611. $unit = strtoupper($this->configuration()->getDiskUnit());
  612. //node
  613. $node = $this->getDefaultNode();
  614. //storages
  615. $storageRepository = new StorageRepository();
  616. $storageRepository->findByNodes([$node->getNode()])
  617. ->findEnabed();
  618. $sizes =[100,200];
  619. foreach ($storageRepository->fetch() as $storage)
  620. {
  621. foreach ($sizes as $size){
  622. $subOptions[] = [
  623. Enum::OPTION_SUB_NAME => sprintf("%s:%s|%s %s %s",$storage->getStorage(), $size,$storage->getStorage(),$size, $unit),
  624. Enum::OPTION_SUB_ORDER => Enum::OPTION_SUB_ORDER_DEFAULT,
  625. ];
  626. }
  627. }
  628. return $subOptions;
  629. }
  630. catch (ProxmoxApiException $ex)
  631. {
  632. return $subOptions;
  633. }
  634. }
  635. }