Files

217 lines
5.3 KiB
PHP
Raw Permalink Normal View History

2014-02-25 12:51:07 +00:00
<?php
2016-08-21 08:07:14 -05:00
/**
* Plugins.php
*
* -Description-
*
* This program 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 3 of the License, or
* (at your option) any later version.
*
* This program 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.
*
* You should have received a copy of the GNU General Public License
2018-07-17 07:46:49 -05:00
* along with this program. If not, see <http://www.gnu.org/licenses/>
2016-08-21 08:07:14 -05:00
*
* @package LibreNMS
2018-07-17 07:46:49 -05:00
* @subpackage Plugins
* @author LibreNMS Group
2016-08-21 08:07:14 -05:00
* @link http://librenms.org
* @copyright 2016
*/
2014-02-25 12:51:07 +00:00
2016-08-17 20:24:27 -05:00
namespace LibreNMS;
2018-05-09 08:05:17 -05:00
use App\Models\Plugin;
2018-12-08 07:16:49 -06:00
use Log;
2018-05-09 08:05:17 -05:00
2018-07-17 07:46:49 -05:00
/**
* Handles loading of plugins
*
* @package LibreNMS
* @subpackage Plugins
* @author LibreNMS Group
* @link http://librenms.org
* @copyright 2016
*
* Supported hooks
* <ul>
* <li>menu</li>
* <li>device_overview_container</li>
* <li>port_container</li>
* </ul>
*/
2016-08-18 20:28:22 -05:00
class Plugins
{
2018-07-17 07:46:49 -05:00
/**
* Array of plugin hooks
*
* @var array
*/
private static $plugins = null;
/**
* Start loading active plugins
*
* @return boolean
*/
public static function start()
{
if (!is_null(self::$plugins)) {
return false;
}
2014-02-25 12:51:07 +00:00
2018-07-17 07:46:49 -05:00
self::$plugins = [];
$plugin_dir = Config::get('plugin_dir');
2015-07-13 20:10:26 +02:00
2018-07-17 07:46:49 -05:00
if (!file_exists($plugin_dir)) {
return false;
}
2015-07-13 20:10:26 +02:00
2018-07-17 07:46:49 -05:00
$plugin_files = Plugin::isActive()->get()->toArray();
foreach ($plugin_files as $plugins) {
$plugin_file = $plugin_dir.'/'.$plugins['plugin_name'].'/'.$plugins['plugin_name'].'.php';
$plugin_info = pathinfo($plugin_file);
if ($plugin_info['extension'] !== 'php') {
continue;
2018-05-09 08:05:17 -05:00
}
2018-07-17 07:46:49 -05:00
if (!is_file($plugin_file)) {
continue;
}
2014-02-25 12:51:07 +00:00
2018-07-17 07:46:49 -05:00
self::load($plugin_file, $plugin_info['filename']);
}
2015-07-13 20:10:26 +02:00
2018-07-17 07:46:49 -05:00
return true;
}
/**
* Load plugin
*
* @param string $file Full path and filename of plugin
* @param string $pluginName Plugin name without any namespace
* @return object|null
*/
2015-07-13 20:10:26 +02:00
public static function load($file, $pluginName)
2014-02-25 12:51:07 +00:00
{
2019-04-11 23:26:42 -05:00
chdir(Config::get('install_dir') . '/html');
2018-07-17 13:55:23 -05:00
$plugin = self::getInstance($file, $pluginName);
2018-07-17 07:46:49 -05:00
if (!is_null($plugin)) {
$class = get_class($plugin);
$hooks = get_class_methods($class);
foreach ((array)$hooks as $hookName) {
if ($hookName[0] != '_') {
self::$plugins[$hookName][] = $class;
}
2018-07-17 13:55:23 -05:00
}
}
2019-04-11 23:26:42 -05:00
chdir(Config::get('install_dir'));
2018-07-17 13:55:23 -05:00
return $plugin;
}
/**
* Get an instance of this plugin
* Search various namespaces and include files if needed.
*
* @param string $file
* @param string $pluginName
* @return object|null
*/
private static function getInstance($file, $pluginName)
{
2018-07-17 07:46:49 -05:00
$ns_prefix = 'LibreNMS\\Plugins\\';
$ns_psr4 = $ns_prefix.$pluginName.'\\'.$pluginName;
$ns_plugin = $ns_prefix.$pluginName;
$ns_global = $pluginName;
2018-07-17 13:55:23 -05:00
if (class_exists($ns_psr4)) {
return new $ns_psr4;
2018-07-17 07:46:49 -05:00
}
2018-07-17 13:55:23 -05:00
if (class_exists($ns_plugin)) {
return new $ns_plugin;
2018-07-17 07:46:49 -05:00
}
2018-07-17 13:55:23 -05:00
// Include file because it's not psr4 (may have been included by previous class_exists calls
include_once $file;
2018-07-17 07:46:49 -05:00
2018-07-17 13:55:23 -05:00
if (class_exists($ns_global)) {
return new $ns_global;
2018-07-17 07:46:49 -05:00
}
2018-07-17 13:55:23 -05:00
return null;
2018-07-17 07:46:49 -05:00
}
2015-07-13 20:10:26 +02:00
2018-07-17 07:46:49 -05:00
/**
* Get all plugins implementing a specific hook.
*
* @param string $hook Name of the hook to get count for
* @return integer|boolean
*/
public static function countHooks($hook)
{
// count all plugins implementing a specific hook
self::start();
if (!empty(self::$plugins[$hook])) {
return count(self::$plugins[$hook]);
} else {
return false;
}
}
2015-07-13 20:10:26 +02:00
2018-07-17 07:46:49 -05:00
/**
* Call hook for plugin.
*
2019-05-13 14:53:29 -05:00
* @param string $hook Name of hook to call
* @param array|false $params Optional array of parameters for hook
* @return string
2018-07-17 07:46:49 -05:00
*/
2016-08-18 20:28:22 -05:00
public static function call($hook, $params = false)
{
2019-04-11 23:26:42 -05:00
chdir(Config::get('install_dir') . '/html');
2018-05-09 08:05:17 -05:00
self::start();
2019-05-13 14:53:29 -05:00
ob_start();
2019-04-11 23:26:42 -05:00
if (!empty(self::$plugins[$hook])) {
foreach (self::$plugins[$hook] as $name) {
try {
if (!is_array($params)) {
@call_user_func([$name, $hook]);
} else {
@call_user_func_array([$name, $hook], $params);
}
} catch (\Exception $e) {
Log::error($e);
2018-12-08 07:16:49 -06:00
}
2015-07-13 20:10:26 +02:00
}
2014-02-25 12:51:07 +00:00
}
2019-05-13 14:53:29 -05:00
$output = ob_get_contents();
ob_end_clean();
2019-04-11 23:26:42 -05:00
chdir(Config::get('install_dir'));
2019-05-13 14:53:29 -05:00
return $output;
2018-07-17 07:46:49 -05:00
}
2018-05-09 08:05:17 -05:00
2018-07-17 07:46:49 -05:00
/**
* Get count of hooks.
*
* @return integer
*/
2018-05-09 08:05:17 -05:00
public static function count()
{
self::start();
return count(self::$plugins);
}
2018-07-17 07:46:49 -05:00
}