Heimdall-Apps/Traefik/Traefik.php
cenci0 8bd7ad0d74 Upgrade Traefik enhanced app to support Traefik v2
Add configuration for the Traefik v2 API.
This app in no longer compatible with Traefik v1 /health endpoint.
2019-10-01 22:17:35 +02:00

163 lines
5.9 KiB
PHP

<?php namespace App\SupportedApps\Traefik;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use Illuminate\Support\Collection;
class Traefik extends \App\SupportedApps implements \App\EnhancedApps {
public function getRequestAttrs()
{
$username = $this->getConfigValue('username', null);
$password = $this->getConfigValue('password', null);
$ignoreTls = $this->getConfigValue('ignore_tls', false);
$isLoginNeeded =
!is_null($username) && !empty($username)
&& !is_null($password) && !empty($password);
$attrs['headers'] = [ 'Accept' => 'application/json'];
if($isLoginNeeded) {
$attrs['auth'] = [ $username, $password ];
}
if($ignoreTls) {
$attrs['verify'] = false;
}
return $attrs;
}
public function test()
{
$attrs = $this->getRequestAttrs();
$test = parent::appTest($this->url('api/version'), $attrs);
echo $test->status;
}
public function livestats()
{
$apiEndpoints = collect([
'httpRouters' => 'api/http/routers',
'httpServices' => 'api/http/services',
'tcpRouters' => 'api/tcp/routers',
'tcpServices' => 'api/tcp/services'
]);
$status = 'active';
$attrs = $this->getRequestAttrs();
$responses = $apiEndpoints->mapWithKeys(function ($endpoint, $key) use ($attrs) {
$response = parent::execute($this->url($endpoint), $attrs);
$body = json_decode($response->getBody());
$bodyCollection = collect($body);
return [ $key => [
'data' => $bodyCollection->filter(function ($value, $key) { return $value->status === 'enabled'; })->count(),
'total' => $bodyCollection->count(),
] ];
});
$data = $this->getViewData($this->getConfigValue('fields', 'E'), $responses);
return parent::getLiveStats($status, $data);
}
public function getViewData($config, $responses)
{
$nullValue = [ 'data' => 0, 'total' => 0 ];
switch ($config) {
/* HTTP routers/services only */
case 'H':
return [
'left' => [
'title' => 'Routers',
'data' => $responses->get('httpRouters', $nullValue)['data'],
'total' => $responses->get('httpRouters', $nullValue)['total'],
],
'right' => [
'title' => 'Services',
'data' => $responses->get('httpServices', $nullValue)['data'],
'total' => $responses->get('httpServices', $nullValue)['total'],
],
];
break;
/* TCP routers/services only */
case 'T':
return [
'left' => [
'title' => 'Routers',
'data' => $responses->get('tcpRouters', $nullValue)['data'],
'total' => $responses->get('tcpRouters', $nullValue)['total'],
],
'right' => [
'title' => 'Services',
'data' => $responses->get('tcpServices', $nullValue)['data'],
'total' => $responses->get('tcpServices', $nullValue)['total'],
],
];
/* Routers only */
case 'R':
return [
'left' => [
'title' => 'HTTP',
'data' => $responses->get('httpRouters', $nullValue)['data'],
'total' => $responses->get('httpRouters', $nullValue)['total'],
],
'right' => [
'title' => 'TCP',
'data' => $responses->get('tcpRouters', $nullValue)['data'],
'total' => $responses->get('tcpRouters', $nullValue)['total'],
],
];
/* Services only */
case 'S':
return [
'left' => [
'title' => 'HTTP',
'data' => $responses->get('httpServices', $nullValue)['data'],
'total' => $responses->get('httpServices', $nullValue)['total'],
],
'right' => [
'title' => 'TCP',
'data' => $responses->get('tcpServices', $nullValue)['data'],
'total' => $responses->get('tcpServices', $nullValue)['total'],
],
];
/* Everything */
default:
return [
'left' => [
'title' => 'Routers',
'data' => $responses->get('httpRouters', $nullValue)['data'] + $responses->get('tcpRouters', $nullValue)['data'],
'total' => $responses->get('httpRouters', $nullValue)['total'] + $responses->get('tcpRouters', $nullValue)['total'],
],
'right' => [
'title' => 'Services',
'data' => $responses->get('httpServices', $nullValue)['data'] + $responses->get('tcpServices', $nullValue)['data'],
'total' => $responses->get('httpServices', $nullValue)['total'] + $responses->get('tcpServices', $nullValue)['total'],
],
];
}
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url).$endpoint;
return $api_url;
}
public function getConfigValue($key, $default=null)
{
return (isset($this->config) && isset($this->config->$key)) ? $this->config->$key : $default;
}
}