581 lines
16 KiB
PHP
Executable File
581 lines
16 KiB
PHP
Executable File
<?php
|
|
|
|
// Pandora FMS - https://pandorafms.com
|
|
// ==================================================
|
|
// Copyright (c) 2005-2023 Pandora FMS
|
|
// Please see https://pandorafms.com/community/ for full contribution list
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public License
|
|
// as published by the Free Software Foundation; version 2
|
|
// 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.
|
|
|
|
/**
|
|
* @package Include
|
|
* @subpackage Extensions
|
|
*/
|
|
|
|
$extension_file = '';
|
|
|
|
|
|
/**
|
|
* Callback function for extensions in the console
|
|
*
|
|
* @param string $filename with contents of the extension
|
|
*/
|
|
function extensions_call_main_function($filename)
|
|
{
|
|
global $config;
|
|
|
|
$extension = &$config['extensions'][$filename];
|
|
if ($extension['main_function'] != '') {
|
|
$params = [];
|
|
call_user_func_array(
|
|
$extension['main_function'],
|
|
array_values(($params ?? []))
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Callback function for godmode extensions
|
|
*
|
|
* @param string $filename File with extension contents
|
|
*/
|
|
function extensions_call_godmode_function($filename)
|
|
{
|
|
global $config;
|
|
|
|
$extension = &$config['extensions'][$filename];
|
|
if ($extension['godmode_function'] != '') {
|
|
$params = [];
|
|
call_user_func_array(
|
|
$extension['godmode_function'],
|
|
array_values(($params ?? []))
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Callback login function for extensions
|
|
*/
|
|
function extensions_call_login_function()
|
|
{
|
|
global $config;
|
|
|
|
$params = [];
|
|
foreach ($config['extensions'] as $extension) {
|
|
if ($extension['login_function'] == '') {
|
|
continue;
|
|
}
|
|
|
|
call_user_func_array(
|
|
$extension['login_function'],
|
|
array_values(($params ?? []))
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Checks if the current page is an extension
|
|
*
|
|
* @param string $page To check
|
|
*/
|
|
function extensions_is_extension($page)
|
|
{
|
|
global $config;
|
|
|
|
$return = false;
|
|
|
|
// Avoid the old update manager
|
|
if ($page != 'godmode/update_manager/update_manager.php') {
|
|
$filename = basename($page);
|
|
|
|
$return = isset($config['extensions'][$filename]);
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
|
|
/**
|
|
* Scan the EXTENSIONS_DIR or ENTERPRISE_DIR.'/'.EXTENSIONS_DIR for search
|
|
* the files extensions.
|
|
*
|
|
* @param boolean $enterprise
|
|
*/
|
|
function extensions_get_extensions($enterprise=false, $rel_path='')
|
|
{
|
|
$dir = $rel_path.EXTENSIONS_DIR;
|
|
$master_dir = $rel_path.ENTERPRISE_DIR.'/'.EXTENSIONS_DIR;
|
|
$handle = false;
|
|
if ($enterprise) {
|
|
$dir = $rel_path.ENTERPRISE_DIR.'/'.EXTENSIONS_DIR;
|
|
if (defined('METACONSOLE')) {
|
|
$dir = $rel_path.'../'.EXTENSIONS_DIR;
|
|
$master_dir = $rel_path.'../'.EXTENSIONS_DIR;
|
|
}
|
|
} else {
|
|
if (defined('METACONSOLE')) {
|
|
$dir = $rel_path.'../../'.$dir;
|
|
$master_dir = $rel_path.'../'.EXTENSIONS_DIR;
|
|
}
|
|
}
|
|
|
|
if (file_exists($dir)) {
|
|
$handle = @opendir($dir);
|
|
}
|
|
|
|
if (empty($handle)) {
|
|
return;
|
|
}
|
|
|
|
$file = readdir($handle);
|
|
$extensions = [];
|
|
$ignores = [
|
|
'.',
|
|
'..',
|
|
];
|
|
while ($file !== false) {
|
|
if (in_array($file, $ignores)) {
|
|
$file = readdir($handle);
|
|
continue;
|
|
}
|
|
|
|
$filepath = realpath($dir.'/'.$file);
|
|
if (! is_readable($filepath) || is_dir($filepath) || ! preg_match('/.*\.php$/', $filepath)) {
|
|
$file = readdir($handle);
|
|
continue;
|
|
}
|
|
|
|
if ($file == 'update_manager.php') {
|
|
continue;
|
|
}
|
|
|
|
$extension['file'] = $file;
|
|
$extension['operation_menu'] = '';
|
|
$extension['godmode_menu'] = '';
|
|
$extension['main_function'] = '';
|
|
$extension['godmode_function'] = '';
|
|
$extension['login_function'] = '';
|
|
$extension['enterprise'] = $enterprise;
|
|
$extension['dir'] = $dir;
|
|
$extensions[$file] = $extension;
|
|
$file = readdir($handle);
|
|
}
|
|
|
|
// Load extensions in enterprise directory
|
|
if (! $enterprise && file_exists($master_dir)) {
|
|
return array_merge($extensions, extensions_get_extensions(true, $rel_path));
|
|
}
|
|
|
|
if (isset($extensions['ipam.php'])) {
|
|
unset($extensions['ipam.php']);
|
|
}
|
|
|
|
return $extensions;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Check if an extension is enabled
|
|
*
|
|
* @param string Extension name (ended with .php)
|
|
* @return True if enabled
|
|
*/
|
|
function extensions_is_enabled_extension($name)
|
|
{
|
|
global $config;
|
|
return isset($config['extensions'][$name])
|
|
|| isset($config['extensions'][$name.'.php']);
|
|
}
|
|
|
|
|
|
/**
|
|
* Get disabled open and enterprise extensions
|
|
*/
|
|
function extensions_get_disabled_extensions()
|
|
{
|
|
global $config;
|
|
|
|
$extensions = [];
|
|
|
|
$dirs = [
|
|
'open' => EXTENSIONS_DIR.'/disabled',
|
|
'enterprise' => ENTERPRISE_DIR.'/'.EXTENSIONS_DIR.'/disabled',
|
|
];
|
|
|
|
foreach ($dirs as $type => $dir) {
|
|
$handle = false;
|
|
|
|
if (file_exists($dir)) {
|
|
$handle = @opendir($dir);
|
|
}
|
|
|
|
if (empty($handle)) {
|
|
continue;
|
|
}
|
|
|
|
$ignores = [
|
|
'.',
|
|
'..',
|
|
];
|
|
|
|
$file = readdir($handle);
|
|
while ($file !== false) {
|
|
if (in_array($file, $ignores)) {
|
|
$file = readdir($handle);
|
|
continue;
|
|
}
|
|
|
|
$filepath = realpath($dir.'/'.$file);
|
|
if (! is_readable($filepath) || is_dir($filepath) || ! preg_match('/.*\.php$/', $filepath)) {
|
|
$file = readdir($handle);
|
|
continue;
|
|
}
|
|
|
|
// $content = file_get_contents($filepath);
|
|
$content = '';
|
|
|
|
$data = [];
|
|
|
|
$data['operation_menu'] = false;
|
|
if (preg_match("/<?php(\n|.)*extensions_add_operation_menu_option(\n|.)*?>/", $content)) {
|
|
$data['operation_menu'] = true;
|
|
}
|
|
|
|
$data['godmode_menu'] = false;
|
|
if (preg_match('/<\?php(\n|.)*extensions_add_godmode_menu_option(\n|.)*\?>/', $content)) {
|
|
$data['godmode_menu'] = true;
|
|
}
|
|
|
|
$data['operation_function'] = false;
|
|
if (preg_match('/<\?php(\n|.)*extensions_add_main_function(\n|.)*\?>/', $content)) {
|
|
$data['operation_function'] = true;
|
|
}
|
|
|
|
$data['login_function'] = false;
|
|
if (preg_match('/<\?php(\n|.)*extensions_add_login_function(\n|.)*\?>/', $content)) {
|
|
$data['login_function'] = true;
|
|
}
|
|
|
|
$data['extension_ope_tab'] = false;
|
|
if (preg_match('/<\?php(\n|.)*extensions_add_opemode_tab_agent(\n|.)*\?>/', $content)) {
|
|
$data['extension_ope_tab'] = true;
|
|
}
|
|
|
|
$data['extension_god_tab'] = false;
|
|
if (preg_match('/<\?php(\n|.)*extensions_add_godmode_tab_agent(\n|.)*\?>/', $content)) {
|
|
$data['extension_god_tab'] = true;
|
|
}
|
|
|
|
$data['godmode_function'] = false;
|
|
if (preg_match('/<\?php(\n|.)*extensions_add_godmode_function(\n|.)*\?>/', $content)) {
|
|
$data['godmode_function'] = true;
|
|
}
|
|
|
|
$data['enterprise'] = false;
|
|
if ($type == 'enterprise') {
|
|
$data['enterprise'] = true;
|
|
}
|
|
|
|
$data['enabled'] = false;
|
|
|
|
$extensions[$file] = $data;
|
|
|
|
$file = readdir($handle);
|
|
}
|
|
}
|
|
|
|
return $extensions;
|
|
}
|
|
|
|
|
|
/**
|
|
* Get info of all extensions (enabled/disabled)
|
|
*/
|
|
function extensions_get_extension_info()
|
|
{
|
|
global $config;
|
|
|
|
$return = [];
|
|
|
|
foreach ($config['extensions'] as $extension) {
|
|
$data = [];
|
|
$data['godmode_function'] = false;
|
|
if (!empty($extension['godmode_function'])) {
|
|
$data['godmode_function'] = true;
|
|
}
|
|
|
|
$data['godmode_menu'] = false;
|
|
if (!empty($extension['godmode_menu'])) {
|
|
$data['godmode_menu'] = true;
|
|
}
|
|
|
|
$data['operation_function'] = false;
|
|
if (!empty($extension['main_function'])) {
|
|
$data['operation_function'] = true;
|
|
}
|
|
|
|
$data['operation_menu'] = false;
|
|
if (!empty($extension['operation_menu'])) {
|
|
$data['operation_menu'] = true;
|
|
}
|
|
|
|
$data['login_function'] = false;
|
|
if (!empty($extension['login_function'])) {
|
|
$data['login_function'] = true;
|
|
}
|
|
|
|
$data['extension_ope_tab'] = false;
|
|
if (!empty($extension['extension_ope_tab'])) {
|
|
$data['extension_ope_tab'] = true;
|
|
}
|
|
|
|
$data['extension_god_tab'] = false;
|
|
if (!empty($extension['extension_god_tab'])) {
|
|
$data['extension_god_tab'] = true;
|
|
}
|
|
|
|
$data['enterprise'] = (bool) $extension['enterprise'];
|
|
|
|
$data['enabled'] = true;
|
|
|
|
$return[$extension['file']] = $data;
|
|
}
|
|
|
|
$return = ($return + extensions_get_disabled_extensions());
|
|
|
|
return $return;
|
|
}
|
|
|
|
|
|
/**
|
|
* Load all extensions
|
|
*
|
|
* @param array $extensions
|
|
*/
|
|
function extensions_load_extensions($process_login)
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
foreach ($config['extensions'] as $extension) {
|
|
$extension_file = $extension['file'];
|
|
$path_extension = realpath($extension['dir'].'/'.$extension_file);
|
|
|
|
// --------------------------------------------------------------
|
|
//
|
|
// PHP BUG
|
|
//
|
|
// #66518 need some exceptions for php's include or require
|
|
//
|
|
// https://bugs.php.net/bug.php?id=66518
|
|
// --------------------------------------------------------------
|
|
// ~ if ($process_login) {
|
|
// ~ //Check the syntax for avoid PHP errors
|
|
// ~ $output = null;
|
|
// ~ $return_var = null;
|
|
// ~ exec('php -l ' . $path_extension, $output, $return_code);
|
|
// ~ if ($return_code !== 0) {
|
|
// ~ // There is a error.
|
|
// ~
|
|
// ~ set_pandora_error_for_header(
|
|
// ~ __('There are some errors in the PHP file of extension %s .', $extension_file));
|
|
// ~ }
|
|
// ~ else {
|
|
// ~ require_once($path_extension);
|
|
// ~ }
|
|
// ~ }
|
|
// ~ else {
|
|
try {
|
|
include_once $path_extension;
|
|
}
|
|
|
|
// PHP 7
|
|
catch (Throwable $e) {
|
|
}
|
|
|
|
// PHP 5
|
|
catch (Exception $e) {
|
|
}
|
|
|
|
// ~ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* This function adds a link to the extension with the given name in Operation menu.
|
|
*
|
|
* @param string name Name of the extension in the Operation menu
|
|
* @param string fatherId Id of the parent menu item for the current extension
|
|
* @param string subfatherId Id of the parent submenu item for the current extension
|
|
* @param string icon Path to the icon image (18x18 px). If this parameter is blank then predefined icon will be used
|
|
*/
|
|
function extensions_add_operation_menu_option($name, $fatherId=null, $icon=null, $version='N/A', $subfatherId=null, $acl='AR')
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
/*
|
|
$config['extension_file'] is set in extensions_load_extensions(),
|
|
since that function must be called before any function the extension
|
|
call, we are sure it will be set.
|
|
*/
|
|
$option_menu['name'] = $name;
|
|
$option_menu['acl'] = $acl;
|
|
$extension = &$config['extensions'][$extension_file];
|
|
|
|
$option_menu['sec2'] = $extension['dir'].'/'.mb_substr($extension_file, 0, -4);
|
|
$option_menu['fatherId'] = $fatherId;
|
|
$option_menu['subfatherId'] = $subfatherId;
|
|
$option_menu['icon'] = $icon;
|
|
$option_menu['version'] = $version;
|
|
|
|
$extension['operation_menu'] = $option_menu;
|
|
}
|
|
|
|
|
|
/**
|
|
* This function adds a link to the extension with the given name in Godmode menu.
|
|
*
|
|
* @param string name Name of the extension in the Godmode menu
|
|
* @param string acl User ACL level required to see this extension in the godmode menu
|
|
* @param string fatherId Id of the parent menu item for the current extension
|
|
* @param string subfatherId Id of the parent submenu item for the current extension
|
|
* @param string icon Path to the icon image (18x18 px). If this parameter is blank then predefined icon will be used
|
|
*/
|
|
function extensions_add_godmode_menu_option($name, $acl, $fatherId=null, $icon=null, $version='N/A', $subfatherId=null)
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
/*
|
|
$config['extension_file'] is set in extensions_load_extensions(),
|
|
since that function must be called before any function the extension
|
|
call, we are sure it will be set. */
|
|
$option_menu['acl'] = $acl;
|
|
$option_menu['name'] = $name;
|
|
$extension = &$config['extensions'][$extension_file];
|
|
$option_menu['sec2'] = $extension['dir'].'/'.mb_substr($extension_file, 0, -4);
|
|
$option_menu['fatherId'] = $fatherId;
|
|
$option_menu['subfatherId'] = $subfatherId;
|
|
$option_menu['icon'] = $icon;
|
|
$option_menu['version'] = $version;
|
|
$extension['godmode_menu'] = $option_menu;
|
|
}
|
|
|
|
|
|
/**
|
|
* Add in the header tabs in Godmode agent menu the extension tab.
|
|
*
|
|
* @param tabId Id of the extension tab
|
|
* @param tabName Name of the extension tab
|
|
* @param tabIcon Path to the image icon
|
|
* @param tabFunction Name of the function to execute when this extension is called
|
|
*/
|
|
function extensions_add_godmode_tab_agent($tabId, $tabName, $tabIcon, $tabFunction, $version='N/A', $acl='AW')
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
$extension = &$config['extensions'][$extension_file];
|
|
$extension['extension_god_tab'] = [];
|
|
$extension['extension_god_tab']['id'] = $tabId;
|
|
$extension['extension_god_tab']['name'] = $tabName;
|
|
$extension['extension_god_tab']['icon'] = $tabIcon;
|
|
$extension['extension_god_tab']['function'] = $tabFunction;
|
|
$extension['extension_god_tab']['version'] = $version;
|
|
$extension['extension_ope_tab']['acl'] = $acl;
|
|
}
|
|
|
|
|
|
/**
|
|
* Add in the header tabs in Operation agent menu the extension tab.
|
|
*
|
|
* @param tabId Id of the extension tab
|
|
* @param tabName Name of the extension tab
|
|
* @param tabIcon Path to the image icon
|
|
* @param tabFunction Name of the function to execute when this extension is called
|
|
*/
|
|
function extensions_add_opemode_tab_agent($tabId, $tabName, $tabIcon, $tabFunction, $version='N/A', $acl='AR')
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
$extension = &$config['extensions'][$extension_file];
|
|
$extension['extension_ope_tab'] = [];
|
|
$extension['extension_ope_tab']['id'] = $tabId;
|
|
$extension['extension_ope_tab']['name'] = $tabName;
|
|
$extension['extension_ope_tab']['icon'] = $tabIcon;
|
|
$extension['extension_ope_tab']['function'] = $tabFunction;
|
|
$extension['extension_ope_tab']['version'] = $version;
|
|
$extension['extension_ope_tab']['acl'] = $acl;
|
|
}
|
|
|
|
|
|
/**
|
|
* Add the function to call when user clicks on the Operation menu link
|
|
*
|
|
* @param string $function_name Callback function name
|
|
*/
|
|
function extensions_add_main_function($function_name)
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
$extension = &$config['extensions'][$extension_file];
|
|
$extension['main_function'] = $function_name;
|
|
}
|
|
|
|
|
|
/**
|
|
* Add the function to call when user clicks on the Godmode menu link
|
|
*
|
|
* @param string $function_name Callback function name
|
|
*/
|
|
function extensions_add_godmode_function($function_name)
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
$extension = &$config['extensions'][$extension_file];
|
|
$extension['godmode_function'] = $function_name;
|
|
}
|
|
|
|
|
|
/**
|
|
* Adds extension function when user login on Pandora console
|
|
*
|
|
* @param string $function_name Callback function name
|
|
*/
|
|
function extensions_add_login_function($function_name)
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
$extension = &$config['extensions'][$extension_file];
|
|
$extension['login_function'] = $function_name;
|
|
}
|
|
|
|
|
|
/**
|
|
* Adds extension function when translation string
|
|
*
|
|
* @param string $function_name Callback function name
|
|
*/
|
|
function extensions_add_translation_string_function($translate_function_name)
|
|
{
|
|
global $config;
|
|
global $extension_file;
|
|
|
|
$extension = &$config['extensions'][$extension_file];
|
|
$extension['translate_function'] = $translate_function_name;
|
|
}
|