2009-08-28 18:52:10 +02:00
< ? php
2019-06-06 17:50:47 +02:00
/**
* Module groups .
*
* @ category Extensions
* @ package Pandora FMS
* @ subpackage Module groups view .
* @ version 1.0 . 0
* @ license See below
*
* ______ ___ _______ _______ ________
2023-06-08 12:42:10 +02:00
* | __ \ .-----.--.--.--| |.-----.----.-----. | ___ | | | __ |
* | __ /| _ | | _ || _ | _ | _ | | ___ | | __ |
2019-06-06 17:50:47 +02:00
* | ___ | | ___ . _ | __ | __ | _____ || _____ | __ | | ___ . _ | | ___ | | __ | _ | __ | _______ |
*
* ============================================================================
2023-06-08 11:53:13 +02:00
* Copyright ( c ) 2005 - 2023 Pandora FMS
2023-06-08 13:19:01 +02:00
* Please see https :// pandorafms . com / community / for full contribution list
2019-06-06 17:50:47 +02:00
* 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 for 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 .
* ============================================================================
*/
2011-03-22 23:11:57 +01:00
2019-06-06 17:50:47 +02:00
// Begin.
2010-10-25 17:49:56 +02:00
global $config ;
2019-01-30 16:18:44 +01:00
check_login ();
2021-05-18 17:18:54 +02:00
// ACL Check.
2023-05-23 10:53:08 +02:00
if ( check_acl ( $config [ 'id_user' ], 0 , 'AR' ) === 0 && check_acl ( $config [ 'id_user' ], 0 , 'RR' ) === 0 ) {
2019-11-18 17:18:40 +01:00
db_pandora_audit (
2022-01-20 10:55:23 +01:00
AUDIT_LOG_ACL_VIOLATION ,
2019-11-18 17:18:40 +01:00
'Trying to access Module Groups view'
);
include 'general/noaccess.php' ;
exit ;
}
2019-01-30 16:18:44 +01:00
if ( is_ajax ()) {
$get_info_alert_module_group = ( bool ) get_parameter ( 'get_info_alert_module_group' );
if ( $get_info_alert_module_group ) {
$send_tooltip = json_decode ( io_safe_output ( get_parameter ( 'send_tooltip' )), true );
echo " <ul class='tooltip_counters'><h3> " . __ ( 'Counters Module' ) . '</h3>' ;
echo " <li><div style='background-color: " . COL_ALERTFIRED . " ;'></div> " . __ ( 'Alerts_Fired' ) . ': ' . $send_tooltip [ 'alerts_module_count' ] . '</li>' ;
echo " <li><div style='background-color: " . COL_CRITICAL . " ;'></div> " . __ ( 'Critical' ) . ': ' . $send_tooltip [ 'critical_module_count' ] . '</li>' ;
2024-05-15 14:08:44 +02:00
echo " <li><div style='background-color: " . COL_WARNING . " ;'></div> " . __ ( 'Warning' ) . ': ' . $send_tooltip [ 'warning_module_count' ] . '</li>' ;
2019-01-30 16:18:44 +01:00
echo " <li><div style='background-color: " . COL_UNKNOWN . " ;'></div> " . __ ( 'Unknown' ) . ': ' . $send_tooltip [ 'unknown_module_count' ] . '</li>' ;
echo " <li><div style='background-color: " . COL_NORMAL . " ;'></div> " . __ ( 'OK' ) . ': ' . $send_tooltip [ 'normal_module_count' ] . '</li>' ;
echo " <li><div style='background-color: " . COL_MAINTENANCE . " ;'></div> " . __ ( 'Not_init' ) . ': ' . $send_tooltip [ 'notInit_module_count' ] . '</li></ul>' ;
}
2012-10-25 18:46:52 +02:00
}
2015-06-08 13:13:09 +02:00
2019-01-30 16:18:44 +01:00
2021-05-18 17:18:54 +02:00
/**
* The main function of module groups and the enter point to
* execute the code .
*
* @ return void
*/
2019-01-30 16:18:44 +01:00
function mainModuleGroups ()
{
global $config ;
include_once $config [ 'homedir' ] . '/include/class/TreeGroup.class.php' ;
include_once $config [ 'homedir' ] . '/include/functions_groupview.php' ;
$tree_group = new TreeGroup ( 'group' , 'group' );
$tree_group -> setPropagateCounters ( false );
$tree_group -> setDisplayAllGroups ( true );
$tree_group -> setFilter (
[
'searchAgent' => '' ,
'statusAgent' => AGENT_STATUS_ALL ,
'searchModule' => '' ,
'statusModule' => - 1 ,
'groupID' => 0 ,
'tagID' => 0 ,
'show_not_init_agents' => 1 ,
'show_not_init_modules' => 1 ,
]
);
$info = $tree_group -> getArray ();
$info = groupview_plain_groups ( $info );
$offset = get_parameter ( 'offset' , 0 );
$agent_group_search = get_parameter ( 'agent_group_search' , '' );
$module_group_search = get_parameter ( 'module_group_search' , '' );
2019-11-18 17:18:40 +01:00
// Check the user's group permissions.
2024-02-09 13:51:56 +01:00
$user_groups = users_get_groups ( $config [ 'id_user' ], 'AR' );
2019-11-18 17:18:40 +01:00
$info = array_filter (
$info ,
2021-05-18 17:18:54 +02:00
function ( $v ) use ( $user_groups ) {
2019-11-18 17:18:40 +01:00
return $user_groups [ $v [ 'id' ]] != null ;
},
ARRAY_FILTER_USE_BOTH
);
2019-01-30 16:18:44 +01:00
$info = array_filter (
$info ,
2021-05-18 17:18:54 +02:00
function ( $v ) use ( $agent_group_search ) {
2019-06-06 17:50:47 +02:00
return preg_match (
'/' . $agent_group_search . '/i' ,
$v [ 'name' ]
);
2019-01-30 16:18:44 +01:00
},
ARRAY_FILTER_USE_BOTH
);
2021-05-18 17:18:54 +02:00
if ( empty ( $info ) === false ) {
2024-02-09 13:51:56 +01:00
$groups_view = ( isset ( $is_not_paginated ) === true ) ? $info : array_slice (
2019-06-06 17:50:47 +02:00
$info ,
$offset ,
$config [ 'block_size' ]
);
2019-01-30 16:18:44 +01:00
$agents_counters = array_reduce (
$groups_view ,
function ( $carry , $item ) {
$carry [ $item [ 'id' ]] = $item ;
return $carry ;
},
[]
);
$ids_array = array_keys ( $agents_counters );
$ids_group = implode ( ',' , $ids_array );
} else {
$ids_group = - 1 ;
}
2020-10-20 12:38:42 +02:00
$counter = count ( $info );
2019-01-30 16:18:44 +01:00
$condition_critical = modules_get_state_condition ( AGENT_MODULE_STATUS_CRITICAL_ALERT );
$condition_warning = modules_get_state_condition ( AGENT_MODULE_STATUS_WARNING_ALERT );
$condition_unknown = modules_get_state_condition ( AGENT_MODULE_STATUS_UNKNOWN );
$condition_not_init = modules_get_state_condition ( AGENT_MODULE_STATUS_NO_DATA );
$condition_normal = modules_get_state_condition ( AGENT_MODULE_STATUS_NORMAL );
$array_for_defect = [];
$array_module_group = [];
$array_data = [];
$sql = 'SELECT id_mg, `name` FROM tmodule_group' ;
$array_mod = db_get_all_rows_sql ( $sql );
foreach ( $array_mod as $key => $value ) {
$array_module_group [ $value [ 'id_mg' ]] = $value [ 'name' ];
}
$array_module_group [ 0 ] = 'Nothing' ;
$array_module_group = array_filter (
$array_module_group ,
2021-05-18 17:18:54 +02:00
function ( $v ) use ( $module_group_search ) {
2019-06-06 17:50:47 +02:00
return preg_match ( '/' . $module_group_search . '/i' , $v );
2019-01-30 16:18:44 +01:00
},
ARRAY_FILTER_USE_BOTH
);
foreach ( $agents_counters as $key => $value ) {
$array_for_defect [ $key ][ 'gm' ] = $array_module_group ;
$array_for_defect [ $key ][ 'data' ][ 'name' ] = $value [ 'name' ];
$array_for_defect [ $key ][ 'data' ][ 'parent' ] = $value [ 'parent' ];
$array_for_defect [ $key ][ 'data' ][ 'icon' ] = $value [ 'icon' ];
}
2019-06-06 17:50:47 +02:00
$sql = sprintf (
" SELECT SUM(IF(tae.alert_fired <> 0, 1, 0)) AS alerts_module_count,
SUM ( IF ( % s , 1 , 0 )) AS warning_module_count ,
SUM ( IF ( % s , 1 , 0 )) AS unknown_module_count ,
SUM ( IF ( % s , 1 , 0 )) AS notInit_module_count ,
SUM ( IF ( % s , 1 , 0 )) AS critical_module_count ,
SUM ( IF ( % s , 1 , 0 )) AS normal_module_count ,
COUNT ( tae . id_agente_modulo ) AS total_count ,
tmg . id_mg ,
tmg . name as n ,
tg . id_grupo
FROM (
SELECT tam . id_agente_modulo ,
tam . id_module_group ,
ta . id_grupo AS g ,
tae . estado ,
SUM ( IF ( tatm . last_fired <> 0 , 1 , 0 )) AS alert_fired
FROM tagente_modulo tam
LEFT JOIN talert_template_modules tatm
ON tatm . id_agent_module = tam . id_agente_modulo
AND tatm . times_fired = 1
LEFT JOIN tagente_estado tae
ON tae . id_agente_modulo = tam . id_agente_modulo
INNER JOIN tagente ta
ON ta . id_agente = tam . id_agente
WHERE ta . disabled = 0
AND tam . disabled = 0
2021-05-28 13:20:16 +02:00
AND tam . id_modulo <> 0
2019-06-06 17:50:47 +02:00
AND tam . delete_pending = 0
AND ta . id_grupo IN ( % s )
GROUP BY tam . id_agente_modulo
UNION ALL
SELECT tam . id_agente_modulo ,
tam . id_module_group ,
tasg . id_group AS g ,
tae . estado ,
SUM ( IF ( tatm . last_fired <> 0 , 1 , 0 )) AS alert_fired
FROM tagente_modulo tam
LEFT JOIN talert_template_modules tatm
ON tatm . id_agent_module = tam . id_agente_modulo
AND tatm . times_fired = 1
LEFT JOIN tagente_estado tae
ON tae . id_agente_modulo = tam . id_agente_modulo
INNER JOIN tagente ta
ON ta . id_agente = tam . id_agente
INNER JOIN tagent_secondary_group tasg
ON ta . id_agente = tasg . id_agent
WHERE ta . disabled = 0
AND tam . disabled = 0
AND tam . delete_pending = 0
AND tasg . id_group IN ( % s )
GROUP BY tam . id_agente_modulo , tasg . id_group
) AS tae
RIGHT JOIN tgrupo tg
ON tg . id_grupo = tae . g
INNER JOIN (
SELECT * FROM tmodule_group
UNION ALL
SELECT 0 AS 'id_mg' , 'Nothing' AS 'name'
) AS tmg
ON tae . id_module_group = tmg . id_mg
GROUP BY tae . g , tmg . id_mg " ,
$condition_warning ,
$condition_unknown ,
$condition_not_init ,
$condition_critical ,
$condition_normal ,
$ids_group ,
$ids_group
);
2018-09-20 15:51:36 +02:00
2019-01-30 16:18:44 +01:00
$array_data_prev = db_get_all_rows_sql ( $sql );
2018-09-20 15:51:36 +02:00
2019-01-30 16:18:44 +01:00
foreach ( $array_data_prev as $key => $value ) {
$array_data [ $value [ 'id_grupo' ]][ $value [ 'id_mg' ]] = $value ;
}
2018-08-21 13:33:16 +02:00
2021-04-29 13:28:03 +02:00
// Header.
ui_print_standard_header (
2019-04-24 13:53:18 +02:00
__ ( 'Combined table of agent group and module group' ),
'images/module_group.png' ,
false ,
2020-05-29 11:37:06 +02:00
'' ,
2019-04-24 13:53:18 +02:00
false ,
2021-04-29 13:28:03 +02:00
[],
[
[
'link' => '' ,
'label' => __ ( 'Monitoring' ),
],
[
'link' => '' ,
'label' => __ ( 'Views' ),
],
]
2019-04-24 13:53:18 +02:00
);
2018-09-20 15:51:36 +02:00
2023-02-24 12:16:30 +01:00
$output = " <form method='post'
action = 'index.php?sec=view&sec2=extensions/module_groups' > " ;
$output .= " <table cellpadding='4' cellspacing='4' class='filter-table-adv margin-bottom-10' width='100%'><tr> " ;
$output .= '<td>' ;
$output .= html_print_label_input_block (
__ ( 'Search by agent group' ),
html_print_input_text (
'agent_group_search' ,
$agent_group_search ,
'' ,
50 ,
255 ,
true
)
);
$output .= '</td><td>' ;
$output .= html_print_label_input_block (
__ ( 'Search by module group' ),
html_print_input_text (
'module_group_search' ,
$module_group_search ,
'' ,
50 ,
255 ,
true
)
);
$output .= '</td>' ;
$output .= '</tr></table>' ;
$output .= html_print_div (
2022-10-21 13:47:41 +02:00
[
2023-02-24 12:16:30 +01:00
'class' => 'action-buttons' ,
'content' => html_print_submit_button (
__ ( 'Filter' ),
'srcbutton' ,
false ,
[
'icon' => 'search' ,
'mode' => 'mini' ,
],
true
),
],
true
);
$output .= '</form>' ;
ui_toggle (
$output ,
'<span class="subsection_header_title">' . __ ( 'Filters' ) . '</span>' ,
'filter_form' ,
'' ,
true ,
false ,
'' ,
'white-box-content' ,
'box-flat white_table_graph fixed_filter_bar'
2022-10-21 13:47:41 +02:00
);
2019-01-30 16:18:44 +01:00
2019-06-06 17:50:47 +02:00
$cell_style = '
min - width : 60 px ;
width : 100 % ;
margin : 0 ;
overflow : hidden ;
text - align : center ;
padding : 5 px ;
padding - bottom : 10 px ;
font - size : 18 px ;
text - align : center ;
' ;
2019-11-18 17:18:40 +01:00
if ( $info && $array_module_group ) {
2019-01-30 16:18:44 +01:00
$table = new StdClass ();
2023-02-27 13:41:44 +01:00
$table -> class = 'info_table' ;
$table -> style [ 0 ] = 'font-weight: bolder; min-width: 230px;' ;
2023-11-24 12:54:19 +01:00
$table -> id = 'agent_group_module_group' ;
2019-01-30 16:18:44 +01:00
$table -> width = '100%' ;
$head [ 0 ] = __ ( 'Groups' );
$headstyle [ 0 ] = 'width: 20%; font-weight: bolder;' ;
foreach ( $array_module_group as $key => $value ) {
2023-02-27 13:41:44 +01:00
$headstyle [] = 'min-width: 60px;max-width: 5%;text-align:center; font-weight: bolder;' ;
$head [] = ui_print_truncate_text (
$value ,
GENERIC_SIZE_TEXT ,
true ,
true ,
true ,
'…'
);
2019-01-30 16:18:44 +01:00
}
$i = 0 ;
foreach ( $array_for_defect as $key => $value ) {
$deep = groups_get_group_deep ( $key );
2023-02-27 13:41:44 +01:00
$data [ $i ][ 0 ] = $deep . ui_print_truncate_text (
$value [ 'data' ][ 'name' ],
GENERIC_SIZE_TEXT ,
true ,
true ,
true ,
'…'
);
2019-01-30 16:18:44 +01:00
$j = 1 ;
2024-02-09 13:51:56 +01:00
if ( isset ( $background_color ) === false ) {
$background_color = 'none' ;
}
2019-01-30 16:18:44 +01:00
if ( isset ( $array_data [ $key ])) {
foreach ( $value [ 'gm' ] as $k => $v ) {
if ( isset ( $array_data [ $key ][ $k ])) {
$send_tooltip = json_encode ( $array_data [ $key ][ $k ]);
$rel = 'ajax.php?page=extensions/module_groups&get_info_alert_module_group=1&send_tooltip=' . $send_tooltip ;
$url = 'index.php?sec=estado&sec2=operation/agentes/status_monitor&status=-1&ag_group=' . $key . '&modulegroup=' . $k ;
if ( $array_data [ $key ][ $k ][ 'alerts_module_count' ] != 0 ) {
2019-11-18 17:18:40 +01:00
$color = COL_ALERTFIRED ;
2019-01-30 16:18:44 +01:00
// Orange when the cell for this model group and agent has at least one alert fired.
} else if ( $array_data [ $key ][ $k ][ 'critical_module_count' ] != 0 ) {
2019-11-18 17:18:40 +01:00
$color = COL_CRITICAL ;
2021-05-18 17:18:54 +02:00
// Red when the cell for this model group and agent
// has at least one module in critical state and the rest in any state.
2019-01-30 16:18:44 +01:00
} else if ( $array_data [ $key ][ $k ][ 'warning_module_count' ] != 0 ) {
2019-11-18 17:18:40 +01:00
$color = COL_WARNING ;
2021-05-18 17:18:54 +02:00
// Yellow when the cell for this model group and agent
// has at least one in warning state and the rest in green state.
2019-01-30 16:18:44 +01:00
} else if ( $array_data [ $key ][ $k ][ 'unknown_module_count' ] != 0 ) {
2019-11-18 17:18:40 +01:00
$color = COL_UNKNOWN ;
2021-05-18 17:18:54 +02:00
// Grey when the cell for this model group and agent
// has at least one module in unknown state and the rest in any state.
2019-01-30 16:18:44 +01:00
} else if ( $array_data [ $key ][ $k ][ 'normal_module_count' ] != 0 ) {
2019-11-18 17:18:40 +01:00
$color = COL_NORMAL ;
2019-01-30 16:18:44 +01:00
// Green when the cell for this model group and agent has OK state all modules.
} else if ( $array_data [ $key ][ $k ][ 'notInit_module_count' ] != 0 ) {
2019-11-18 17:18:40 +01:00
$color = COL_NOTINIT ;
2019-01-30 16:18:44 +01:00
// Blue when the cell for this module group and all modules have not init value.
}
2019-06-06 17:50:47 +02:00
$data [ $i ][ $j ] = " <div style=' " . $cell_style . 'background:' . $color . " ;'> " ;
2021-10-26 12:57:01 +02:00
$data [ $i ][ $j ] .= " <a class='info_cell white font_18px' rel=' " . $rel . " ' href=' " . $url . " '> " ;
2019-01-30 16:18:44 +01:00
$data [ $i ][ $j ] .= $array_data [ $key ][ $k ][ 'total_count' ];
$data [ $i ][ $j ] .= '</a></div>' ;
} else {
2019-07-09 15:03:38 +02:00
$data [ $i ][ $j ] = " <div style='background: " . $background_color . ';' . $cell_style . " '> " ;
2019-01-30 16:18:44 +01:00
$data [ $i ][ $j ] .= 0 ;
$data [ $i ][ $j ] .= '</div>' ;
}
$j ++ ;
}
} else {
foreach ( $value [ 'gm' ] as $k => $v ) {
2021-03-11 15:40:23 +01:00
$data [ $i ][ $j ] = " <div class='module_gm_groups' style='background: " . $background_color . " '> " ;
2019-01-30 16:18:44 +01:00
$data [ $i ][ $j ] .= 0 ;
$data [ $i ][ $j ] .= '</div>' ;
$j ++ ;
}
}
$i ++ ;
}
$table -> head = $head ;
$table -> headstyle = $headstyle ;
$table -> data = $data ;
2021-03-11 15:40:23 +01:00
echo " <div class='w100p' style='overflow-x:auto;'> " ;
2019-01-30 16:18:44 +01:00
html_print_table ( $table );
echo '</div>' ;
2023-02-24 12:16:30 +01:00
$tablePagination = ui_pagination (
$counter ,
false ,
0 ,
0 ,
true ,
'offset' ,
false
);
html_print_action_buttons (
'' ,
[ 'right_content' => $tablePagination ]
);
2019-01-30 16:18:44 +01:00
2023-02-24 13:09:03 +01:00
$show_legend = '<div>' ;
$show_legend .= '<table>' ;
$show_legend .= " <tr><td class='legend_square_simple'><div style='background-color: " . COL_ALERTFIRED . " ;'></div></td><td> " . __ ( 'Orange cell when the module group and agent have at least one alarm fired.' ) . '</td></tr>' ;
$show_legend .= " <tr><td class='legend_square_simple'><div style='background-color: " . COL_CRITICAL . " ;'></div></td><td> " . __ ( 'Red cell when the module group and agent have at least one module in critical status and the others in any status' ) . '</td></tr>' ;
$show_legend .= " <tr><td class='legend_square_simple'><div style='background-color: " . COL_WARNING . " ;'></div></td><td> " . __ ( 'Yellow cell when the module group and agent have at least one in warning status and the others in grey or green status' ) . '</td></tr>' ;
$show_legend .= " <tr><td class='legend_square_simple'><div style='background-color: " . COL_UNKNOWN . " ;'></div></td><td> " . __ ( 'Grey cell when the module group and agent have at least one in unknown status and the others in green status' ) . '</td></tr>' ;
$show_legend .= " <tr><td class='legend_square_simple'><div style='background-color: " . COL_NORMAL . " ;'></div></td><td> " . __ ( 'Green cell when the module group and agent have all modules in OK status' ) . '</td></tr>' ;
$show_legend .= " <tr><td class='legend_square_simple'><div style='background-color: " . COL_NOTINIT . " ;'></div></td><td> " . __ ( 'Blue cell when the module group and agent have all modules in not init status.' ) . '</td></tr>' ;
$show_legend .= '</table>' ;
$show_legend .= '</div>' ;
ui_toggle ( $show_legend , __ ( 'Legend' ));
2019-01-30 16:18:44 +01:00
} else {
ui_print_info_message ([ 'no_close' => true , 'message' => __ ( 'This table shows in columns the modules group and in rows agents group. The cell shows all modules' ) ]);
ui_print_info_message ([ 'no_close' => true , 'message' => __ ( 'There are no defined groups or module groups' ) ]);
}
2019-02-07 07:58:33 +01:00
ui_require_css_file ( 'cluetip' , 'include/styles/js/' );
2019-01-30 16:18:44 +01:00
ui_require_jquery_file ( 'cluetip' );
?>
< script >
$ ( document ) . ready ( function () {
$ ( " a.info_cell " ) . cluetip ({
arrows : true ,
attribute : 'rel' ,
cluetipClass : 'default' ,
width : '200px'
});
});
</ script >
< ? php
2009-08-28 18:52:10 +02:00
}
2015-06-08 13:13:09 +02:00
2019-01-30 16:18:44 +01:00
extensions_add_operation_menu_option ( __ ( 'Module groups' ), 'estado' , 'module_groups/brick.png' , 'v1r1' , 'view' );
2011-05-11 14:15:14 +02:00
extensions_add_main_function ( 'mainModuleGroups' );