MyMetricProvider.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Metrics;
  3. use ModulesGarden\Servers\HetznerVps\App\Libs\HetznerVps\Api;
  4. use ModulesGarden\Servers\HetznerVps\App\Libs\HetznerVps\Api\Constants;
  5. use ModulesGarden\Servers\ZimbraEmail\App\Helpers\ZimbraManager;
  6. use ModulesGarden\Servers\ZimbraEmail\App\Enums\Size;
  7. use mysql_xdevapi\DocResult;
  8. use WHMCS\UsageBilling\Contracts\Metrics\MetricInterface;
  9. use WHMCS\UsageBilling\Contracts\Metrics\ProviderInterface;
  10. use WHMCS\UsageBilling\Metrics\Metric;
  11. use WHMCS\UsageBilling\Metrics\Units\WholeNumber;
  12. use WHMCS\UsageBilling\Metrics\Usage;
  13. use WHMCS\UsageBilling\Metrics\Units\GigaBytes;
  14. class MyMetricProvider implements ProviderInterface
  15. {
  16. private $moduleParams = [];
  17. public function __construct($moduleParams)
  18. {
  19. $this->moduleParams = $moduleParams;
  20. }
  21. public function metrics()
  22. {
  23. return [
  24. new Metric(
  25. 'mailboxes',
  26. 'Email Accounts',
  27. MetricInterface::TYPE_SNAPSHOT
  28. ),
  29. new Metric(
  30. 'aliases',
  31. 'Email Aliases',
  32. MetricInterface::TYPE_SNAPSHOT
  33. ),
  34. new Metric(
  35. 'distributionLists',
  36. 'Distribution Lists',
  37. MetricInterface::TYPE_SNAPSHOT
  38. ),
  39. new Metric(
  40. 'domainAliases',
  41. 'Domain Aliases',
  42. MetricInterface::TYPE_SNAPSHOT
  43. ),
  44. new Metric(
  45. 'storage',
  46. 'Storage',
  47. MetricInterface::TYPE_SNAPSHOT,
  48. new GigaBytes()
  49. )
  50. ];
  51. }
  52. public function usage()
  53. {
  54. $domains =(new ZimbraManager())
  55. ->getApiByServer($this->moduleParams['serverid'])
  56. ->soap
  57. ->repository()
  58. ->domains()
  59. ->getAll();
  60. $usage = [];
  61. foreach ($domains as $domain)
  62. {
  63. $domainName = $domain->getName();
  64. $mailboxes = $this->getAccounts($domainName);
  65. $countOfMailboxes = count($mailboxes);
  66. $countOfDistributionList = count($this->getDistributionList($domainName));
  67. $countOfEmailAliases = 0;
  68. foreach ($mailboxes as $account)
  69. {
  70. $emailAliases = $account->getAliases();
  71. if (isset($emailAliases) && is_countable($emailAliases)) {
  72. $countOfEmailAliases += count($account->getAliases());
  73. }
  74. }
  75. $domainAliases = $this->getDomainAliases($domainName);
  76. $countOfDomainAliases = count($domainAliases);
  77. $storage = $this->getDomainUsage($domainName);
  78. $domainData = [
  79. 'mailboxes' => $countOfMailboxes,
  80. 'distributionLists' => $countOfDistributionList,
  81. 'aliases' => $countOfEmailAliases,
  82. 'domainAliases' => $countOfDomainAliases,
  83. 'storage' => round($storage / Size::B_TO_GB, 2),
  84. ];
  85. $usage[$domainName] = $this->wrapUserData($domainData);
  86. }
  87. return $usage;
  88. }
  89. public function tenantUsage($tenant)
  90. {
  91. $mailboxes = $this->getAccounts($tenant);
  92. $countOfMailboxes = count($mailboxes);
  93. $countOfEmailAliases = 0;
  94. foreach ($mailboxes as $account)
  95. {
  96. $countOfEmailAliases += count($account->getAliases());
  97. }
  98. $countOfDistributionList = count($this->getDistributionList($tenant));
  99. $domainAliases = $this->getDomainAliases($tenant);
  100. $countOfDomainAliases = count($domainAliases);
  101. $storage = $this->getDomainUsage($tenant);
  102. $userData = [
  103. 'mailboxes' => $countOfMailboxes,
  104. 'distributionLists' => $countOfDistributionList,
  105. 'aliases' => $countOfEmailAliases,
  106. 'domainAliases' => $countOfDomainAliases,
  107. 'storage' => round($storage / Size::B_TO_GB, 2),
  108. ];
  109. return $this->wrapUserData($userData);
  110. }
  111. private function wrapUserData($data)
  112. {
  113. $wrapped = [];
  114. foreach ($this->metrics() as $metric) {
  115. $key = $metric->systemName();
  116. if ($data[$key]) {
  117. $value = $data[$key];
  118. $metric = $metric->withUsage(
  119. new Usage($value)
  120. );
  121. }
  122. $wrapped[] = $metric;
  123. }
  124. return $wrapped;
  125. }
  126. private function getAccounts($tenant)
  127. {
  128. $accounts =(new ZimbraManager())
  129. ->getApiByServer($this->moduleParams['serverid'])
  130. ->soap
  131. ->repository()
  132. ->accounts()
  133. ->getByDomainName($tenant);
  134. return $accounts;
  135. }
  136. private function getDomainAliases($tenant)
  137. {
  138. $domainAliases =(new ZimbraManager())
  139. ->getApiByServer($this->moduleParams['serverid'])
  140. ->soap
  141. ->repository()
  142. ->domains
  143. ->getAliases($tenant);
  144. return $domainAliases;
  145. }
  146. private function getDomainUsage($tenant)
  147. {
  148. $accounts =(new ZimbraManager())
  149. ->getApiByServer($this->moduleParams['serverid'])
  150. ->soap
  151. ->repository()
  152. ->accounts
  153. ->getUsages($tenant);
  154. $totalUsage = 0;
  155. foreach ($accounts as $account)
  156. {
  157. $usage = $account->getUsed();
  158. $totalUsage += $usage;
  159. }
  160. return $totalUsage;
  161. }
  162. private function getDistributionList($tenant)
  163. {
  164. $distributionList =(new ZimbraManager())
  165. ->getApiByServer($this->moduleParams['serverid'])
  166. ->soap
  167. ->repository()
  168. ->lists
  169. ->getAllDistributionListsByDomain($tenant);
  170. return $distributionList;
  171. }
  172. }