diff --git a/app/src/Controller.php b/app/src/Controller.php index 343ca97..1a0e524 100644 --- a/app/src/Controller.php +++ b/app/src/Controller.php @@ -47,15 +47,213 @@ public function __construct(Application $app) */ public function index(Request $request, Response $response, array $args) { - $layout = $request->query->get('layout', 'grid'); - in_array($layout, ['grid', 'list']) or $layout = 'grid'; + $layout = $request->query->get('layout', 'dashboard'); + $filter = $request->query->get('filter', 'none'); + $filter_value = $request->query->get('filter_value', 'none'); + $sort = $request->query->get('sort', 'none'); + + $instances = $this->app['manager']->getAll(); + + $allProcesses = []; + $hosts = []; + $groups = []; + $unreachableHosts = []; + $notRunning = 0; + $states = []; + + //Building datas for layout + foreach ($instances as $key => $value) { + if($value->isConnected()) { + $processes = $value->getAllProcessInfo(); + foreach ($processes as $process) { + $process['host'] = $key; + $allProcesses[] = $process; + array_key_exists($process['host'], $hosts) ? $hosts[$process['host']] += 1 : $hosts[$process['host']] = 1 ; + array_key_exists($process['group'], $groups) ? $groups[$process['group']] += 1 : $groups[$process['group']] = 1; + array_key_exists($process['statename'], $states) ? $states[$process['statename']] += 1 : $states[$process['statename']] = 1; + } + } + else { + $unreachableHosts[] = $key; + } + } + + ksort($hosts); + ksort($groups); + + switch($layout) { + case 'grid': + break; + case 'list': + break; + case 'dashboard': + break; + case 'global': + switch($filter) { + case 'group': + $allProcesses = $this->filter_processes($filter, $filter_value, $allProcesses); + break; + case 'host': + $allProcesses = $this->filter_processes($filter, $filter_value, $allProcesses); + break; + case 'statename': + $allProcesses = $this->filter_processes($filter, $filter_value, $allProcesses); + break; + } + + switch($sort) { + case 'group': + usort($allProcesses, array($this,'group_sort')); + break; + case 'host': + usort($allProcesses, array($this,'host_sort')); + break; + case 'state': + usort($allProcesses, array($this,'state_sort')); + break; + case 'start': + usort($allProcesses, array($this,'start_sort')); + break; + } + + break; + default: + $layout = 'grid'; + break; + } $template = $this->app['twig']->loadTemplate(sprintf('layout/%s.twig', $layout)); - $response->setContent($template->render(['instances' => $this->app['manager']->getAll()])); + + $response->setContent($template->render([ + 'instances' => $instances, + 'hosts' => $hosts, + 'allProcesses' => $allProcesses, + 'states' => $states, + 'filter' => $filter, + 'filter_value' => $filter_value, + 'unreachableHosts' => $unreachableHosts, + 'groups' => $groups + ])); return $response; } + private function group_sort($a, $b) { + return strcmp($a["group"], $b["group"]); + } + + private function host_sort($a, $b) { + return strcmp($a["host"], $b["host"]); + } + + private function start_sort($a, $b) { + return $a["start"] > $b["start"]; + } + + private function state_sort($a, $b) { + return $a["state"] > $b["state"]; + } + + private function filter_processes($key, $value, $processes) { + if ($value == 'all') return $processes; + $tokeep = []; + foreach ($processes as $process) { + //TODO key exist ? + if ($process[$key] == $value) { + $tokeep[] = $process; + } + } + return $tokeep; + } + + /** + * Starts all processes with specific group + * + * @param Request $request + * @param Response $response + * @param array $args + * + * @return Response + */ + public function startGroup(Request $request, Response $response, array $args) + { + $group = $args['group']; + + $instances = $this->app['manager']->getAll(); + + foreach ($instances as $name => $instance) { + if($instance->isConnected()) { + $processes = $instance->getAllProcessInfo(); + foreach ($processes as $process) { + if ($process['group'] == $group || $group == 'all') { + $instance->startProcess($process['group'] . ':' . $process['name'], false); + } + } + } + } + + return new RedirectResponse("/?layout=global&filter=group&filter_value=$group"); + } + + /** + * Restarts all processes with specific group + * + * @param Request $request + * @param Response $response + * @param array $args + * + * @return Response + */ + public function restartGroup(Request $request, Response $response, array $args) + { + $group = $args['group']; + + $instances = $this->app['manager']->getAll(); + + foreach ($instances as $name => $instance) { + if($instance->isConnected()) { + $processes = $instance->getAllProcessInfo(); + foreach ($processes as $process) { + if ($process['group'] == $group || $group == 'all') { + $instance->stopProcess($process['group'] . ':' . $process['name'], true); + $instance->startProcess($process['group'] . ':' . $process['name'], false); + } + } + } + } + + return new RedirectResponse("/?layout=global&filter=group&filter_value=$group"); + } + + /** + * Stops all processes with specific group + * + * @param Request $request + * @param Response $response + * @param array $args + * + * @return Response + */ + public function stopGroup(Request $request, Response $response, array $args) + { + $group = $args['group']; + + $instances = $this->app['manager']->getAll(); + + foreach ($instances as $name => $instance) { + if($instance->isConnected()) { + $processes = $instance->getAllProcessInfo(); + foreach ($processes as $process) { + if ($process['group'] == $group || $group == 'all') { + $instance->stopProcess($process['group'] . ':' . $process['name'], false); + } + } + } + } + + return new RedirectResponse("/?layout=global&filter=group&filter_value=$group"); + } + /** * Starts all processes in an instance * @@ -67,11 +265,13 @@ public function index(Request $request, Response $response, array $args) */ public function startAll(Request $request, Response $response, array $args) { - $instance = $this->app['manager']->get($args['instance']); + $host = $args['instance']; + + $instance = $this->app['manager']->get($host); $instance->startAllProcesses(false); - return new RedirectResponse('/'); + return new RedirectResponse("/?layout=global&filter=host&filter_value=$host"); } /** @@ -85,12 +285,14 @@ public function startAll(Request $request, Response $response, array $args) */ public function restartAll(Request $request, Response $response, array $args) { - $instance = $this->app['manager']->get($args['instance']); + $host = $args['instance']; - $instance->stopAllProcesses(false); + $instance = $this->app['manager']->get($host); + + $instance->stopAllProcesses(true); $instance->startAllProcesses(false); - return new RedirectResponse('/'); + return new RedirectResponse("/?layout=global&filter=host&filter_value=$host"); } /** @@ -104,11 +306,13 @@ public function restartAll(Request $request, Response $response, array $args) */ public function stopAll(Request $request, Response $response, array $args) { - $instance = $this->app['manager']->get($args['instance']); + $host = $args['instance']; + + $instance = $this->app['manager']->get($host); $instance->stopAllProcesses(false); - return new RedirectResponse('/'); + return new RedirectResponse("/?layout=global&filter=host&filter_value=$host"); } /** @@ -142,7 +346,7 @@ public function restartProcess(Request $request, Response $response, array $args { $instance = $this->app['manager']->get($args['instance']); - $instance->stopProcess($args['process'], false); + $instance->stopProcess($args['process'], true); $instance->startProcess($args['process'], false); return new RedirectResponse('/'); diff --git a/app/src/Manager.php b/app/src/Manager.php index aa1be05..e8fba9c 100644 --- a/app/src/Manager.php +++ b/app/src/Manager.php @@ -58,8 +58,9 @@ public function get($instance) $config = $this->config[$instance]; $transport = new StreamSocketTransport; - - $transport->setHeader('Authorization', 'Basic '.base64_encode(sprintf('%s:%s', $config['username'], $config['password']))); + if (array_key_exists('username', $config) && array_key_exists('username', $config)) { + $transport->setHeader('Authorization', 'Basic '.base64_encode(sprintf('%s:%s', $config['username'], $config['password']))); + } $client = new Client($config['url'], $transport); $connector = new XmlRpc($client); diff --git a/app/views/actions_filter.twig b/app/views/actions_filter.twig new file mode 100644 index 0000000..e5ebed9 --- /dev/null +++ b/app/views/actions_filter.twig @@ -0,0 +1,3 @@ + + + diff --git a/app/views/layout/dashboard.twig b/app/views/layout/dashboard.twig new file mode 100644 index 0000000..fbd1b5d --- /dev/null +++ b/app/views/layout/dashboard.twig @@ -0,0 +1,56 @@ +{% extends 'template.twig' %} + +{% block content %} + {% if unreachableHosts is not empty %} +
+
+ +
+
+ {% endif %} +
+
+
+

Total processes {{ allProcesses|length }}

+ View all processes +
+
+
+
+ {% for state, count in states %} +

{{ state }} {{ count }}

+ {% endfor %} +
+
+
+
+
+
+

Hosts {{ hosts|length }}

+
    + {% for host,number in hosts %} +
  • {{ number }} {{ host }}
  • + {% endfor %} +
+
+
+
+
+

Groups {{ groups|length }}

+
    + {% for group,number in groups %} +
  • {{ number }} {{ group }}
  • + {% endfor %} +
+
+
+
+{% endblock %} + diff --git a/app/views/layout/global.twig b/app/views/layout/global.twig new file mode 100644 index 0000000..d7f1de6 --- /dev/null +++ b/app/views/layout/global.twig @@ -0,0 +1,40 @@ +{% extends 'template.twig' %} + +{% block content %} + {% if ( filter != none ) and ( ( filter == 'host' ) or ( filter == 'group' ) ) %} +
+ {{ filter_value }} | {{ allProcesses|length|pluralize('process') }} + + {% include 'actions_filter.twig' %} + +
+ {% endif %} +
+
+
+ + + + + + + + + + {% for process in allProcesses %} + + + + + + + + + {% else %} + + {% endfor %} +
HostGroupNameStateStartControls
{{ process.host }}{{ process.group }}{{ process.name }}{{ process.statename }}{{ process|state_ago }}{% include 'actions.twig' with {'instance': process.host, 'process': process.name, 'group': process.group} only %}
No processes
+
+
+
+{% endblock %} diff --git a/app/views/template.twig b/app/views/template.twig index aa3c744..04d0138 100644 --- a/app/views/template.twig +++ b/app/views/template.twig @@ -33,7 +33,7 @@ - Supervisor Monitor + Supervisor Monitor