Feature #12178: Provide a report for installed services in the new Reports module
authorFrancois Suter <francois.suter@typo3.org>
Fri, 16 Oct 2009 07:30:22 +0000 (07:30 +0000)
committerFrancois Suter <francois.suter@typo3.org>
Fri, 16 Oct 2009 07:30:22 +0000 (07:30 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@6155 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
typo3/sysext/sv/ext_autoload.php [new file with mode: 0644]
typo3/sysext/sv/ext_tables.php
typo3/sysext/sv/reports/class.tx_sv_reports_serviceslist.php [new file with mode: 0644]
typo3/sysext/sv/reports/locallang.xml [new file with mode: 0644]
typo3/sysext/sv/reports/tx_sv_report.css [new file with mode: 0644]
typo3/sysext/sv/reports/tx_sv_report.png [new file with mode: 0755]

index 79e7d50..f5a2bc0 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
 
        * Cleanup #12245: Reports: Cleaned up API for providers in status report
        * Feature #12167: Reports: Enhanced report registration API to provide custom icons for reports
+       * Feature #12178: Provide a report for installed services in the new Reports module
 
 2009-10-15  Steffen Kamper  <info@sk-typo3.de>
 
diff --git a/typo3/sysext/sv/ext_autoload.php b/typo3/sysext/sv/ext_autoload.php
new file mode 100644 (file)
index 0000000..d314da0
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/*
+ * Register necessary class names with autoloader
+ *
+ * $Id: $
+ */
+$extensionPath = t3lib_extMgm::extPath('sv');
+return array(
+       'tx_sv_reports_serviceslist' => $extensionPath . 'reports/class.tx_sv_reports_serviceslist.php',
+);
+?>
index ef5c8fa..7b443c4 100644 (file)
@@ -3,4 +3,12 @@ if (!defined ('TYPO3_MODE'))   die ('Access denied.');
 
 // normal services should be added here
 
+if (TYPO3_MODE == 'BE') {
+       $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']['sv']['services'] = array(
+               'title'       => 'LLL:EXT:sv/reports/locallang.xml:report_title',
+               'description' => 'LLL:EXT:sv/reports/locallang.xml:report_description',
+               'icon'            => 'EXT:sv/reports/tx_sv_report.png',
+               'report'      => 'tx_sv_reports_ServicesList'
+       );
+}
 ?>
\ No newline at end of file
diff --git a/typo3/sysext/sv/reports/class.tx_sv_reports_serviceslist.php b/typo3/sysext/sv/reports/class.tx_sv_reports_serviceslist.php
new file mode 100644 (file)
index 0000000..97ac605
--- /dev/null
@@ -0,0 +1,224 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Francois Suter <francois@typo3.org>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+
+/**
+ * This class provides a report displaying a list of all installed services
+ * Code inspired by EXT:dam/lib/class.tx_dam_svlist.php by Rene Fritz
+ *
+ * @author             Francois Suter <francois@typo3.org>
+ * @package            TYPO3
+ * @subpackage sv
+ *
+ * $Id: $
+ */
+class tx_sv_reports_ServicesList implements tx_reports_Report {
+       /**
+        * Back-reference to the calling reports module
+        * 
+        * @var tx_reports_Module       $reportObject
+        */
+       protected $reportObject;
+
+       /**
+        * Constructor for class tx_sv_reports_ServicesList
+        *
+        * @param       tx_reports_Module       Back-reference to the calling reports module
+        */
+       public function __construct(tx_reports_Module $reportObject) {
+               $this->reportObject = $reportObject;
+               $GLOBALS['LANG']->includeLLFile('EXT:sv/reports/locallang.xml');
+       }
+
+       /**
+        * This method renders the report
+        *
+        * @return      string  The status report as HTML
+        */
+       public function getReport() {
+               $content = '';
+
+                       // Add custom stylesheet
+               $this->reportObject->doc->getPageRenderer()->addCssFile(t3lib_extMgm::extRelPath('sv') . 'reports/tx_sv_report.css');
+                       // Start assembling content
+               $content .= '<p class="help">'
+                       . $GLOBALS['LANG']->getLL('report_explanation')
+                       . '</p>';
+               $content .= '<p class="help">'
+                       . $GLOBALS['LANG']->getLL('externals_explanation')
+                       . '</p>';
+
+                       // Get list of installed services
+               $content .= $this->displayServiceList();
+                       // Get list of binaries search paths
+               $content .= $this->displaySearchPaths();
+
+               return $content;
+       }
+
+       /**
+        * This method assembles a list of all installed services
+        *
+        * @return      string  HTML to display
+        */
+       protected function displayServiceList() {
+               $content = '';
+               $services = $this->getInstalledServices();
+               $content .= '<table cellspacing="1" cellpadding="2" border="0" class="tx_sv_reportlist">';
+               foreach ($services as $serviceType => $installedServices) {
+                       $content .= '<tr><td colspans="7">';
+                       $content .= '<h4>' . sprintf($GLOBALS['LANG']->getLL('service_type'), $serviceType) . '</h4>';
+                       $content .= '</td></tr>';
+                       $content .= '<tr class="bgColor2">';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('service') . '</td>';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('priority') . '</td>';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('quality') . '</td>';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('subtypes') . '</td>';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('os') . '</td>';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('externals') . '</td>';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('available') . '</td>';
+                       $content .= '</tr>';
+                       foreach ($installedServices as $serviceKey => $serviceInfo) {
+                               $content .= '<tr class="bgColor3-20">';
+                               $cellContent = '<p class="service-header"><span class="service-title">' . $serviceInfo['title'] . '</span> (' . $serviceKey . ')</p>';
+                               if (!empty($serviceInfo['description'])) {
+                                       $cellContent .= '<p class="service-description">' . $serviceInfo['description']. '</p>';
+                               }
+                               $content .= '<td class="cell">' . $cellContent . '</td>';
+                               $content .= '<td class="cell">' . $serviceInfo['priority'] . '</td>';
+                               $content .= '<td class="cell">' . $serviceInfo['quality'] . '</td>';
+                               $content .= '<td class="cell">' . ((empty($serviceInfo['serviceSubTypes'])) ? '-' : implode(', ', $serviceInfo['serviceSubTypes'])) . '</td>';
+                               $content .= '<td class="cell">' . ((empty($serviceInfo['os'])) ? $GLOBALS['LANG']->getLL('any') : $serviceInfo['os']) . '</td>';
+                               $content .= '<td class="cell">' . ((empty($serviceInfo['exec'])) ? '-' : $serviceInfo['exec']) . '</td>';
+                               $class = 'typo3-message message-error';
+                               $message = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xml:no');
+                               if (t3lib_extmgm::findService($serviceKey, '*')) {
+                                       $class = 'typo3-message message-ok';
+                                       $message = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xml:yes');
+                               }
+                               $content .= '<td class="cell ' . $class . '">' . $message . '</td>';
+                               $content .= '</tr>';
+                       }
+               }
+               $content .= '</table>';
+               return $content;
+       }
+
+       /**
+        * This method assembles a list of all defined search paths
+        *
+        * @return      string  HTML to display
+        */
+       protected function displaySearchPaths() {
+               $content = '<h3 class="uppercase">' . $GLOBALS['LANG']->getLL('search_paths') . '</h3>';
+               $searchPaths = t3lib_exec::getPaths(true);
+               if (count($searchPaths) == 0) {
+                       $content .= '<p>' . $GLOBALS['LANG']->getLL('no_search_paths') . '</p>';
+               } else {
+                       $content .= '<table cellspacing="1" cellpadding="2" border="0" class="tx_sv_reportlist">';
+                       $content .= '<thead>';
+                       $content .= '<tr class="bgColor2">';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('path') . '</td>';
+                       $content .= '<td class="cell">' . $GLOBALS['LANG']->getLL('valid') . '</td>';
+                       $content .= '</tr>';
+                       $content .= '</thead>';
+                       $content .= '<tbody>';
+                       foreach ($searchPaths as $path => $isValid) {
+                               $content .= '<tr class="bgColor3-20">';
+                               $content .= '<td class="cell">' . $path . '</td>';
+                               $class = 'typo3-message message-error';
+                               $message = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xml:no');
+                               if ($isValid) {
+                                       $class = 'typo3-message message-ok';
+                                       $message = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xml:yes');
+                               }
+                               $content .= '<td class="cell ' . $class . '">' . $message . '</td>';
+                               $content .= '</tr>';
+                       }
+                       $content .= '</tbody>';
+                       $content .= '</table>';
+               }
+               return $content;
+       }
+
+       /**
+        * This method filters the $T3_SERVICES global array to return a relevant,
+        * ordered list of installed services
+        * 
+        * Every installed service appears twice in $T3_SERVICES: once as a service key
+        * for a given service type, and once a service type all by itself
+        * The list of services to display must avoid these duplicates
+        * 
+        * Furthermore, inside each service type, installed services must be
+        * ordered by priority and quality
+        *
+        * @return      array   List of filtered and ordered services
+        */
+       protected function getInstalledServices() {
+               $filteredServices = array();
+
+                       // Loop on all installed services
+               foreach ($GLOBALS['T3_SERVICES'] as $serviceType => $serviceList) {
+                               // If the (first) key of the service list is not the same as the service type,
+                               // it's a "true" service type. Keep it and sort it.
+                       if (key($serviceList) !== $serviceType) {
+                               uasort($serviceList, array('tx_sv_reports_ServicesList', 'sortServices'));
+                               $filteredServices[$serviceType] = $serviceList;
+                       }
+               }
+               return $filteredServices;
+       }
+
+       /**
+        * Utility method used to sort services according to their priority and quality
+        *
+        * @param       array           First service to compare
+        * @param       array           Second service to compare
+        *
+        * @return      integer         1, 0 or -1 if a is smaller, equal or greater than b, respectively
+        */
+       public function sortServices(array $a, array $b) {
+               $result = 0;
+                       // If priorities are the same, test quality
+               if ($a['priority'] == $b['priority']) {
+                       if ($a['quality'] != $b['quality']) {
+                                       // Service with highest quality should come first,
+                                       // thus it must be marked as smaller
+                               $result = ($a['quality'] > $b['quality']) ? -1 : 1;
+                       }
+               } else {
+                               // Service with highest priority should come first,
+                               // thus it must be marked as smaller
+                       $result = ($a['priority'] > $b['priority']) ? -1 : 1;
+               }
+               return $result;
+       }
+}
+
+
+if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/reports/reports/class.tx_reports_reports_status.php'])        {
+       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/reports/reports/class.tx_reports_reports_status.php']);
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/sv/reports/locallang.xml b/typo3/sysext/sv/reports/locallang.xml
new file mode 100644 (file)
index 0000000..33c1aba
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<T3locallang>
+       <meta type="array">
+               <type>module</type>
+               <description>Language labels for module 'tools_txreportsM1'</description>
+       </meta>
+       <data type="array">
+               <languageKey index="default" type="array">
+                       <label index="report_title">Installed Services</label>
+                       <label index="report_description">List of all installed services with information and status for each of them.</label>
+                       <label index="report_explanation">This report displays a list of installed services, with detailed information about each of them. The services are ordered by type, priority and quality. Unavailable services are highlighted with an error status.</label>
+                       <label index="externals_explanation">The "Externals" column shows which external programs a given service relies on. If such program is missing or not executable, the service will be unavailable. Search paths for executables are listed at the bottom of this report.</label>
+                       <label index="service_type">Service type: %s</label>
+                       <label index="service">Service</label>
+                       <label index="priority">Priority</label>
+                       <label index="quality">Quality</label>
+                       <label index="subtypes">Subtypes</label>
+                       <label index="os">OS</label>
+                       <label index="externals">Externals</label>
+                       <label index="available">Available</label>
+                       <label index="any">Any</label>
+                       <label index="search_paths">Configured search paths for external programs</label>
+                       <label index="path">Path</label>
+                       <label index="valid">Valid</label>
+                       <label index="no_search_paths">No search paths configured.</label>
+               </languageKey>
+       </data>
+</T3locallang>
\ No newline at end of file
diff --git a/typo3/sysext/sv/reports/tx_sv_report.css b/typo3/sysext/sv/reports/tx_sv_report.css
new file mode 100644 (file)
index 0000000..0bf56df
--- /dev/null
@@ -0,0 +1,27 @@
+/* Services report styles */
+/* $Id: $ */
+
+.tx_sv_reportlist td {
+       vertical-align: top;
+}
+.tx_sv_reportlist td.cell {
+       padding: 2px 4px;
+}
+.tx_sv_reportlist td.typo3-message {
+       padding: 6px 6px 6px 26px;
+}
+.tx_sv_reportlist .bgColor2 td {
+       text-align: left;
+       font-weight: bold;
+       color: #fff;
+}
+.service-header {
+       margin-bottom: 4px;
+}
+.service-title {
+       font-weight: bold;
+}
+.service-description {
+       margin-bottom: 6px;
+       font-style: italic;
+}
diff --git a/typo3/sysext/sv/reports/tx_sv_report.png b/typo3/sysext/sv/reports/tx_sv_report.png
new file mode 100755 (executable)
index 0000000..179338a
Binary files /dev/null and b/typo3/sysext/sv/reports/tx_sv_report.png differ