uptime_kuma.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. use GuzzleHttp\Client;
  3. use GuzzleHttp\Exception\GuzzleException;
  4. trait UptimeKumaHomepageItem
  5. {
  6. private static Client $kumaClient;
  7. public function uptimeKumaSettingsArray($infoOnly = false)
  8. {
  9. $homepageInformation = [
  10. 'name' => 'UptimeKuma',
  11. 'enabled' => true,
  12. 'image' => 'plugins/images/tabs/kuma.png',
  13. 'category' => 'Monitor',
  14. 'settingsArray' => __FUNCTION__
  15. ];
  16. if ($infoOnly) {
  17. return $homepageInformation;
  18. }
  19. $homepageSettings = [
  20. 'debug' => true,
  21. 'settings' => [
  22. 'Enable' => [
  23. $this->settingsOption('enable', 'homepageUptimeKumaEnabled'),
  24. $this->settingsOption('auth', 'homepageUptimeKumaAuth'),
  25. ],
  26. 'Connection' => [
  27. $this->settingsOption('url', 'uptimeKumaURL', ['help' => 'URL for Uptime Kuma e.g. http://kuma:3001 (no trailing slash)', 'placeholder' => 'http://kuma:3001']),
  28. $this->settingsOption('token', 'uptimeKumaToken'),
  29. ],
  30. 'Options' => [
  31. $this->settingsOption('refresh', 'homepageUptimeKumaRefresh'),
  32. $this->settingsOption('title', 'homepageUptimeKumaHeader'),
  33. $this->settingsOption('toggle-title', 'homepageUptimeKumaHeaderToggle'),
  34. $this->settingsOption('switch', 'homepageUptimeKumaCompact', ['label' => 'Compact view', 'help' => 'Toggles the compact view of this homepage module']),
  35. $this->settingsOption('switch', 'homepageUptimeKumaShowLatency', ['label' => 'Show monitor latency']),
  36. ],
  37. ]
  38. ];
  39. return array_merge($homepageInformation, $homepageSettings);
  40. }
  41. public function uptimeKumaHomepagePermissions($key = null)
  42. {
  43. $permissions = [
  44. 'main' => [
  45. 'enabled' => [
  46. 'homepageUptimeKumaEnabled'
  47. ],
  48. 'auth' => [
  49. 'homepageUptimeKumaAuth'
  50. ],
  51. 'not_empty' => [
  52. 'uptimeKumaURL',
  53. 'uptimeKumaToken',
  54. ]
  55. ]
  56. ];
  57. return $this->homepageCheckKeyPermissions($key, $permissions);
  58. }
  59. public function homepageOrderUptimeKuma()
  60. {
  61. if ($this->homepageItemPermissions($this->uptimeKumaHomepagePermissions('main'))) {
  62. return '
  63. <div id="' . __FUNCTION__ . '">
  64. <div class="white-box homepage-loading-box"><h2 class="text-center" lang="en">Loading Uptime Kuma...</h2></div>
  65. <script>
  66. // Uptime Kuma
  67. homepageUptimeKuma("' . $this->config['homepageUptimeKumaRefresh'] . '");
  68. // End Uptime Kuma
  69. </script>
  70. </div>
  71. ';
  72. }
  73. }
  74. public function getUptimeKumaHomepageData()
  75. {
  76. if (!$this->homepageItemPermissions($this->uptimeKumaHomepagePermissions('main'), true)) {
  77. return false;
  78. }
  79. $api = [];
  80. $url = $this->qualifyURL($this->config['uptimeKumaURL']);
  81. try {
  82. $metrics = (new UptimeKumaMetrics(
  83. $this->getKumaClient($url, $this->config['uptimeKumaToken'])
  84. ->get('/metrics')
  85. ->getBody()
  86. ->getContents()
  87. ))->process();
  88. $api = [
  89. 'data' => $metrics->getMonitors(),
  90. 'options' => [
  91. 'title' => $this->config['homepageUptimeKumaHeader'],
  92. 'titleToggle' => $this->config['homepageUptimeKumaHeaderToggle'],
  93. 'compact' => $this->config['homepageUptimeKumaCompact'],
  94. 'showLatency' => $this->config['homepageUptimeKumaShowLatency'],
  95. ]
  96. ];
  97. } catch (GuzzleException $e) {
  98. $this->setLoggerChannel('UptimeKuma')->error($e);
  99. $this->setAPIResponse('error', $e->getMessage(), 401);
  100. return false;
  101. };
  102. $api = isset($api) ? $api : false;
  103. $this->setAPIResponse('success', null, 200, $api);
  104. return $api;
  105. }
  106. private function getKumaClient(string $url, string $token): Client
  107. {
  108. if (!isset(static::$kumaClient)) {
  109. static::$kumaClient = new Client([
  110. 'base_uri' => $url,
  111. 'headers' => [
  112. 'Authorization' => sprintf("Basic %s", base64_encode(':'.$token)),
  113. ],
  114. ]);
  115. }
  116. return static::$kumaClient;
  117. }
  118. }