MyMetricProvider.php 5.8 KB

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