MyMetricProvider.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace ModulesGarden\Servers\KerioEmail\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\KerioEmail\App\Helpers\KerioManager;
  6. use ModulesGarden\Servers\KerioEmail\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 KerioManager())
  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. $countOfEmailAliases += count($account->getAliases());
  71. }
  72. $domainAliases = $this->getDomainAliases($domainName);
  73. $countOfDomainAliases = count($domainAliases);
  74. $storage = $this->getDomainUsage($domainName);
  75. $domainData = [
  76. 'mailboxes' => $countOfMailboxes,
  77. 'distributionLists' => $countOfDistributionList,
  78. 'aliases' => $countOfEmailAliases,
  79. 'domainAliases' => $countOfDomainAliases,
  80. 'storage' => round($storage / Size::B_TO_GB, 2),
  81. ];
  82. $usage[$domainName] = $this->wrapUserData($domainData);
  83. }
  84. return $usage;
  85. }
  86. public function tenantUsage($tenant)
  87. {
  88. $mailboxes = $this->getAccounts($tenant);
  89. $countOfMailboxes = count($mailboxes);
  90. $countOfEmailAliases = 0;
  91. foreach ($mailboxes as $account)
  92. {
  93. $countOfEmailAliases += count($account->getAliases());
  94. }
  95. $countOfDistributionList = count($this->getDistributionList($tenant));
  96. $domainAliases = $this->getDomainAliases($tenant);
  97. $countOfDomainAliases = count($domainAliases);
  98. $storage = $this->getDomainUsage($tenant);
  99. $userData = [
  100. 'mailboxes' => $countOfMailboxes,
  101. 'distributionLists' => $countOfDistributionList,
  102. 'aliases' => $countOfEmailAliases,
  103. 'domainAliases' => $countOfDomainAliases,
  104. 'storage' => round($storage / Size::B_TO_GB, 2),
  105. ];
  106. return $this->wrapUserData($userData);
  107. }
  108. private function wrapUserData($data)
  109. {
  110. $wrapped = [];
  111. foreach ($this->metrics() as $metric) {
  112. $key = $metric->systemName();
  113. if ($data[$key]) {
  114. $value = $data[$key];
  115. $metric = $metric->withUsage(
  116. new Usage($value)
  117. );
  118. }
  119. $wrapped[] = $metric;
  120. }
  121. return $wrapped;
  122. }
  123. private function getAccounts($tenant)
  124. {
  125. $accounts =(new KerioManager())
  126. ->getApiByServer($this->moduleParams['serverid'])
  127. ->soap
  128. ->repository()
  129. ->accounts()
  130. ->getByDomainName($tenant);
  131. return $accounts;
  132. }
  133. private function getDomainAliases($tenant)
  134. {
  135. $domainAliases =(new KerioManager())
  136. ->getApiByServer($this->moduleParams['serverid'])
  137. ->soap
  138. ->repository()
  139. ->domains
  140. ->getAliases($tenant);
  141. return $domainAliases;
  142. }
  143. private function getDomainUsage($tenant)
  144. {
  145. $accounts =(new KerioManager())
  146. ->getApiByServer($this->moduleParams['serverid'])
  147. ->soap
  148. ->repository()
  149. ->accounts
  150. ->getUsages($tenant);
  151. $totalUsage = 0;
  152. foreach ($accounts as $account)
  153. {
  154. $usage = $account->getUsed();
  155. $totalUsage += $usage;
  156. }
  157. return $totalUsage;
  158. }
  159. private function getDistributionList($tenant)
  160. {
  161. $distributionList =(new KerioManager())
  162. ->getApiByServer($this->moduleParams['serverid'])
  163. ->soap
  164. ->repository()
  165. ->lists
  166. ->getAllDistributionListsByDomain($tenant);
  167. return $distributionList;
  168. }
  169. }