src/Controller/HomeController.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Task;
  4. use App\Helper\BackupsHelper;
  5. use App\Helper\DashboardHelper;
  6. use App\Helper\EdgeAppsHelper;
  7. use App\Helper\StorageHelper;
  8. use App\Helper\SystemHelper;
  9. use App\Repository\TaskRepository;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. /**
  15.  * Require IS_AUTHENTICATED_FULLY for *every* controller method in this class.
  16.  *
  17.  * @IsGranted("IS_AUTHENTICATED_FULLY")
  18.  */
  19. class HomeController extends AbstractController
  20. {
  21.     private TaskRepository $taskRepository;
  22.     private SystemHelper $systemHelper;
  23.     private EdgeAppsHelper $edgeAppsHelper;
  24.     private StorageHelper $storageHelper;
  25.     private DashboardHelper $dashboardHelper;
  26.     private BackupsHelper $backupsHelper;
  27.     public function __construct(
  28.         TaskRepository $taskRepository,
  29.         SystemHelper $systemHelper,
  30.         EdgeAppsHelper $edgeAppsHelper,
  31.         StorageHelper $storageHelper,
  32.         DashboardHelper $dashboardHelper,
  33.         BackupsHelper $backupsHelper
  34.     ) {
  35.         $this->taskRepository $taskRepository;
  36.         $this->systemHelper $systemHelper;
  37.         $this->edgeAppsHelper $edgeAppsHelper;
  38.         $this->storageHelper $storageHelper;
  39.         $this->dashboardHelper $dashboardHelper;
  40.         $this->backupsHelper $backupsHelper;
  41.     }
  42.     /**
  43.      * @Route("/", name="home")
  44.      */
  45.     public function index(): Response
  46.     {
  47.         return $this->render('home/index.html.twig', [
  48.             'controller_title' => 'Dashboard',
  49.             'controller_subtitle' => 'Welcome back!',
  50.             'container_system_uptime' => $this->getSystemUptimeContainerVar(),
  51.             'container_working_edgeapps' => $this->getWorkingEdgeAppsContainerVars(),
  52.             'container_storage_summary' => $this->getStorageSummaryContainerVars(),
  53.             'container_backups_last_run' => $this->getLastBackupRunContainerVar(),
  54.             'container_actions_overview' => $this->getActionsOverviewContainerVars(),
  55.             'container_apps_quickaccess' => $this->getQuickEdgeAppsAccessContainerVars(),
  56.             'dashboard_settings' => $this->dashboardHelper->getSettings(),
  57.             'tunnel_status_code' => '',
  58.         ]);
  59.     }
  60.     private function getWorkingEdgeAppsContainerVars(): array
  61.     {
  62.         $apps_list $this->edgeAppsHelper->getEdgeAppsList();
  63.         $result = [
  64.             'total' => 0,
  65.             'online' => 0,
  66.         ];
  67.         if (!empty($apps_list)) {
  68.             foreach ($apps_list as $edgeapp) {
  69.                 if ('on' == $edgeapp['status']['description']) {
  70.                     ++$result['total'];
  71.                     if ($edgeapp['internet_accessible']) {
  72.                         ++$result['online'];
  73.                     }
  74.                 }
  75.             }
  76.         }
  77.         return $result;
  78.     }
  79.     private function getSystemUptimeContainerVar(): string
  80.     {
  81.         $uptime $this->systemHelper->getUptimeInSeconds();
  82.         $days $uptime / (60 60 24);
  83.         $hours $uptime / (60 60);
  84.         $minutes $uptime 60;
  85.         if ($days >= 2) {
  86.             return (int) $days.' days';
  87.         }
  88.         if ($hours >= 2) {
  89.             return (int) $hours.' hours';
  90.         }
  91.         if ($minutes >= 2) {
  92.             return (int) $minutes.' minutes';
  93.         }
  94.         return $uptime.' seconds';
  95.     }
  96.     private function getLastBackupRunContainerVar(): string
  97.     {
  98.         return $this->backupsHelper->getLastBackupRunTime();
  99.     }
  100.     private function getActionsOverviewContainerVars(): array
  101.     {
  102.         $action_descriptions = [
  103.             'install_edgeapp' => [
  104.                 Task::STATUS_CREATED => 'Waiting to install %s EdgeApp',
  105.                 Task::STATUS_EXECUTING => 'Installing %s EdgeApp...',
  106.                 Task::STATUS_FINISHED => 'Installed %s EdgeApp',
  107.                 Task::STATUS_ERROR => 'Failed to install %s EdgeApp',
  108.             ],
  109.             'remove_edgeapp' => [
  110.                 Task::STATUS_CREATED => 'Waiting to remove %s EdgeApp',
  111.                 Task::STATUS_EXECUTING => 'Removing %s EdgeApp...',
  112.                 Task::STATUS_FINISHED => 'Removed %s EdgeApp',
  113.                 Task::STATUS_ERROR => 'Failed to remove %s EdgeApp',
  114.             ],
  115.             'start_edgeapp' => [
  116.                 Task::STATUS_CREATED => 'Waiting to start %s EdgeApp',
  117.                 Task::STATUS_EXECUTING => 'Starting %s EdgeApp',
  118.                 Task::STATUS_FINISHED => 'Started %s EdgeApp',
  119.                 Task::STATUS_ERROR => 'Failed to start %s EdgeApp',
  120.             ],
  121.             'stop_edgeapp' => [
  122.                 Task::STATUS_CREATED => 'Waiting to stop %s EdgeApp',
  123.                 Task::STATUS_EXECUTING => 'Stopping %s EdgeApp',
  124.                 Task::STATUS_FINISHED => 'Stopped %s EdgeApp',
  125.                 Task::STATUS_ERROR => 'Failed to stop %s edgeApp',
  126.             ],
  127.             'enable_online' => [
  128.                 Task::STATUS_CREATED => 'Waiting to enable online access to %s',
  129.                 Task::STATUS_EXECUTING => 'Enabling Online access to %s',
  130.                 Task::STATUS_FINISHED => 'Enabled Online access to %s EdgeApp',
  131.                 Task::STATUS_ERROR => 'Failed to give online access to %s EdgeApp',
  132.             ],
  133.             'disable_online' => [
  134.                 Task::STATUS_CREATED => 'Waiting to restrict online access to %s',
  135.                 Task::STATUS_EXECUTING => 'Restricting Online access to %s',
  136.                 Task::STATUS_FINISHED => 'Restricted Online access to %s EdgeApp',
  137.                 Task::STATUS_ERROR => 'Failed to restrict online access to %s EdgeApp',
  138.             ],
  139.             'setup_tunnel' => [
  140.                 Task::STATUS_CREATED => 'Waiting to configure access tunnel',
  141.                 Task::STATUS_EXECUTING => 'Configuring access tunnel',
  142.                 Task::STATUS_FINISHED => 'Configured access tunnel',
  143.                 Task::STATUS_ERROR => 'Failed to configure access tunnel',
  144.             ],
  145.             'start_tunnel' => [
  146.                 Task::STATUS_CREATED => 'Waiting to start access tunnel',
  147.                 Task::STATUS_EXECUTING => 'Enabling access tunnel',
  148.                 Task::STATUS_FINISHED => 'Enabled access tunnel',
  149.                 Task::STATUS_ERROR => 'Failed to enable access tunnel',
  150.             ],
  151.             'stop_tunnel' => [
  152.                 Task::STATUS_CREATED => 'Waiting to stop access tunnel',
  153.                 Task::STATUS_EXECUTING => 'Stopping access tunnel',
  154.                 Task::STATUS_FINISHED => 'Stopped access tunnel',
  155.                 Task::STATUS_ERROR => 'Problem while stopping access tunnel',
  156.             ],
  157.             'disable_tunnel' => [
  158.                 Task::STATUS_CREATED => 'Waiting to disable access tunnel',
  159.                 Task::STATUS_EXECUTING => 'Disabling access tunnel',
  160.                 Task::STATUS_FINISHED => 'Disabled access tunnel',
  161.                 Task::STATUS_ERROR => 'Failed to disable access tunnel',
  162.             ],
  163.             'enable_public_dashboard' => [
  164.                 Task::STATUS_CREATED => 'Waiting to enable online access to dashboard',
  165.                 Task::STATUS_EXECUTING => 'Enabling Online access to the Dashboard',
  166.                 Task::STATUS_FINISHED => 'Enabled Online access to the Dashboard',
  167.                 Task::STATUS_ERROR => 'Failed to Enable Online access to the Dashboard',
  168.             ],
  169.             'disable_public_dashboard' => [
  170.                 Task::STATUS_CREATED => 'Waiting to disable online access to dashboard',
  171.                 Task::STATUS_EXECUTING => 'Disabling Online access to the Dashboard',
  172.                 Task::STATUS_FINISHED => 'Disabled Online access to the Dashboard',
  173.                 Task::STATUS_ERROR => 'Failed to Disable Online access to the Dashboard',
  174.             ],
  175.             'start_backups' => [
  176.                 Task::STATUS_CREATED => 'Waiting to start a manual backup',
  177.                 Task::STATUS_EXECUTING => 'Starting manual backup',
  178.                 Task::STATUS_FINISHED => 'Started a manual system backup',
  179.                 Task::STATUS_ERROR => 'Failed to start a manual backup',
  180.             ],
  181.             'set_edgeapp_options' => [
  182.                 Task::STATUS_CREATED => 'Waiting to set options for %s EdgeApp',
  183.                 Task::STATUS_EXECUTING => 'Setting options for %s EdgeApp',
  184.                 Task::STATUS_FINISHED => 'Updated options for %s EdgeApp',
  185.                 Task::STATUS_ERROR => 'Failed to set options for %s EdgeApp',
  186.             ],
  187.         ];
  188.         $unknown_action_descriptions = [
  189.             Task::STATUS_CREATED => 'Waiting to run action: %s %s',
  190.             Task::STATUS_EXECUTING => 'Running action: %s %s',
  191.             Task::STATUS_FINISHED => 'Action ran: %s %s',
  192.             Task::STATUS_ERROR => 'Failed to run action: %s %s',
  193.         ];
  194.         $action_icons = [
  195.             'install_edgeapp' => 'spaceship',
  196.             'remove_edgeapp' => 'fat-remove',
  197.             'start_edgeapp' => 'button-play',
  198.             'stop_edgeapp' => 'button-pause',
  199.             'enable_online' => 'planet',
  200.             'disable_online' => 'scissors',
  201.             'setup_tunnel' => 'planet',
  202.             'disable_tunnel' => 'scissors',
  203.             'enable_public_dashboard' => 'ui-04',
  204.             'disable_public_dashboard' => 'ui-04',
  205.             'unknown_action' => 'ui-04',
  206.         ];
  207.         $action_overview_list = [];
  208.         $latest_tasks $this->taskRepository->getLatestTasks(5);
  209.         foreach ($latest_tasks as $task) {
  210.             $action_args json_decode($task->getArgs(), true);
  211.             if (empty($action_descriptions[$task->getTask()])) {
  212.                 // Indicates an action which is not documented in the descriptions.
  213.                 $action_description sprintf($unknown_action_descriptions[$task->getStatus()], $task->getTask(), $task->getArgs());
  214.             } else {
  215.                 if (!empty($action_args['id'])) {
  216.                     $action_description sprintf($action_descriptions[$task->getTask()][$task->getStatus()], $action_args['id']);
  217.                 } else {
  218.                     $action_description $action_descriptions[$task->getTask()][$task->getStatus()];
  219.                 }
  220.             }
  221.             $action_icon = !empty($action_icons[$task->getTask()]) ? $action_icons[$task->getTask()] : $action_icons['unknown_action'];
  222.             switch ($task->getStatus()) {
  223.                 case Task::STATUS_CREATED:
  224.                     /*
  225.                         The color css class "warning" will have the task icon be shwon in orange, which is a better mood indicator that something is happening.
  226.                         See https://github.com/edgebox-iot/api/pull/15#discussion_r643806656
  227.                     */
  228.                     $icon_color_class 'warning';
  229.                     break;
  230.                 case Task::STATUS_EXECUTING:
  231.                     $icon_color_class 'warning';
  232.                     break;
  233.                 case Task::STATUS_FINISHED:
  234.                     $icon_color_class 'success';
  235.                     break;
  236.                 case Task::STATUS_ERROR:
  237.                     $icon_color_class 'danger';
  238.                     break;
  239.                 default:
  240.                     $icon_color_class 'dark';
  241.                     break;
  242.             }
  243.             $action_overview_list[] = [
  244.                 'task' => $task,
  245.                 'description' => $action_description,
  246.                 'last_update' => strtoupper($task->getUpdated()->format('j M g:i A')),
  247.                 'icon' => $action_icon,
  248.                 'icon_color_class' => $icon_color_class,
  249.             ];
  250.         }
  251.         return $action_overview_list;
  252.     }
  253.     private function getStorageSummaryContainerVars(): array
  254.     {
  255.         $storage_devices_list $this->storageHelper->getStorageDevicesList();
  256.         if (empty($storage_devices_list)) {
  257.             $result = [
  258.                 'percentage' => 'Working...',
  259.                 'free' => '',
  260.             ];
  261.         } else {
  262.             $result $this->storageHelper->getOverallStorageSummary($storage_devices_list);
  263.         }
  264.         return $result;
  265.     }
  266.     private function getQuickEdgeAppsAccessContainerVars(): array
  267.     {
  268.         $apps_list $this->edgeAppsHelper->getEdgeAppsList();
  269.         $result = [
  270.             'total' => 0,
  271.             'apps' => [],
  272.         ];
  273.         if (!empty($apps_list)) {
  274.             foreach ($apps_list as $edgeapp) {
  275.                 if ('on' == $edgeapp['status']['description']) {
  276.                     ++$result['total'];
  277.                     $result['apps'][] = [
  278.                         'id' => $edgeapp['id'],
  279.                         'url' => $edgeapp['internet_accessible'] ? 'https://'.$edgeapp['internet_url'] : 'http://'.$edgeapp['network_url'],
  280.                     ];
  281.                 }
  282.             }
  283.         }
  284.         return $result;
  285.     }
  286. }