2013-02-14 17:44:45 +01:00
< ? php
2019-03-04 15:33:36 +01:00
/**
* Extension to manage a list of gateways and the node address where they should
* point to .
*
* @ category Extensions
* @ package Pandora FMS
* @ subpackage Community
* @ version 1.0 . 0
* @ license See below
*
* ______ ___ _______ _______ ________
* | __ \ .-----.--.--.--| |.-----.----.-----. | ___ | | | __ |
* | __ /| _ | | _ || _ | _ | _ | | ___ | | __ |
* | ___ | | ___ . _ | __ | __ | _____ || _____ | __ | | ___ . _ | | ___ | | __ | _ | __ | _______ |
*
* ============================================================================
* Copyright ( c ) 2005 - 2019 Artica Soluciones Tecnologicas
* Please see http :// pandorafms . org for full contribution list
* 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 .
* ============================================================================
*/
2013-02-14 17:44:45 +01:00
2019-01-30 16:18:44 +01:00
require_once $config [ 'homedir' ] . '/include/functions_config.php' ;
2019-03-04 15:33:36 +01:00
enterprise_include_once (
$config [ 'homedir' ] . '/enterprise/include/pdf_translator.php'
);
enterprise_include_once (
$config [ 'homedir' ] . '/enterprise/include/functions_metaconsole.php'
);
// Date format for nfdump.
2013-02-14 17:44:45 +01:00
global $nfdump_date_format ;
$nfdump_date_format = 'Y/m/d.H:i:s' ;
2019-01-30 16:18:44 +01:00
2013-02-14 17:44:45 +01:00
/**
* Selects all netflow filters ( array ( id_name => id_name )) or filters filtered
*
* @ param tree string SNMP tree returned by snmp_broser_get_tree .
* @ param id string Level ID . Do not set , used for recursion .
* @ param depth string Branch depth . Do not set , used for recursion .
*/
2019-03-04 15:33:36 +01:00
function snmp_browser_print_tree (
$tree ,
$id = 0 ,
$depth = 0 ,
$last = 0 ,
$last_array = [],
$sufix = false ,
2019-04-09 18:33:02 +02:00
$checked = [],
2019-04-11 15:05:03 +02:00
$return = false ,
$descriptive_ids = false ,
$previous_id = ''
2019-03-04 15:33:36 +01:00
) {
2019-01-30 16:18:44 +01:00
static $url = false ;
2019-04-09 18:33:02 +02:00
$output = '' ;
2019-03-04 15:33:36 +01:00
// Get the base URL for images.
2019-01-30 16:18:44 +01:00
if ( $url === false ) {
$url = ui_get_full_url ( 'operation/tree' , false , false , false );
}
2019-03-04 15:33:36 +01:00
// Leaf.
2019-01-30 16:18:44 +01:00
if ( empty ( $tree [ '__LEAVES__' ])) {
return ;
}
$count = 0 ;
$total = ( sizeof ( array_keys ( $tree [ '__LEAVES__' ])) - 1 );
$last_array [ $depth ] = $last ;
if ( $depth > 0 ) {
2019-04-09 18:33:02 +02:00
$output .= " <ul id='ul_ $id ' style='margin: 0; padding: 0; display: none'> \n " ;
2019-01-30 16:18:44 +01:00
} else {
2019-04-09 18:33:02 +02:00
$output .= " <ul id='ul_ $id ' style='margin: 0; padding: 0;'> \n " ;
2019-01-30 16:18:44 +01:00
}
foreach ( $tree [ '__LEAVES__' ] as $level => $sub_level ) {
2019-02-20 08:52:29 +01:00
// Id used to expand leafs.
2019-01-30 16:18:44 +01:00
$sub_id = time () . rand ( 0 , getrandmax ());
2019-02-20 08:52:29 +01:00
// Display the branch.
2019-04-09 18:33:02 +02:00
$output .= " <li id='li_ $sub_id ' style='margin: 0; padding: 0;'> " ;
2019-01-30 16:18:44 +01:00
2019-02-20 08:52:29 +01:00
// Indent sub branches.
2019-01-30 16:18:44 +01:00
for ( $i = 1 ; $i <= $depth ; $i ++ ) {
if ( $last_array [ $i ] == 1 ) {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/no_branch.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
} else {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/branch.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
}
}
2019-02-20 08:52:29 +01:00
// Branch.
2019-01-30 16:18:44 +01:00
if ( ! empty ( $sub_level [ '__LEAVES__' ])) {
2019-04-09 18:33:02 +02:00
$output .= " <a id='anchor_ $sub_id ' onfocus='javascript: this.blur();' href='javascript: toggleTreeNode( \" $sub_id\ " , \ " $id\ " ); ' > " ;
2019-01-30 16:18:44 +01:00
if ( $depth == 0 && $count == 0 ) {
if ( $count == $total ) {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/one_closed.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
} else {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/first_closed.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
}
} else if ( $count == $total ) {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/last_closed.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
} else {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/closed.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
}
2019-04-09 18:33:02 +02:00
$output .= '</a>' ;
2019-01-30 16:18:44 +01:00
}
2019-04-09 18:33:02 +02:00
2019-02-20 08:52:29 +01:00
// Leave.
2019-01-30 16:18:44 +01:00
else {
if ( $depth == 0 && $count == 0 ) {
if ( $count == $total ) {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/no_branch.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
} else {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/first_leaf.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
}
} else if ( $count == $total ) {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/last_leaf.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
} else {
2019-04-09 18:33:02 +02:00
$output .= '<img src="' . $url . '/leaf.png" style="vertical-align: middle;">' ;
2019-01-30 16:18:44 +01:00
}
}
// Branch or leave with branches!
if ( isset ( $sub_level [ '__OID__' ])) {
2019-04-09 18:33:02 +02:00
$output .= " <a onfocus='javascript: this.blur();' href='javascript: snmpGet( \" " . addslashes ( $sub_level [ '__OID__' ]) . " \" );'> " ;
$output .= '<img src="' . $url . '/../../images/eye.png" style="vertical-align: middle;">' ;
$output .= '</a>' ;
2019-01-30 16:18:44 +01:00
}
2019-02-20 08:52:29 +01:00
$checkbox_name_sufix = ( $sufix === true ) ? '_' . $level : '' ;
2019-04-11 15:05:03 +02:00
if ( $descriptive_ids === true ) {
$checkbox_name = 'create_' . $sub_id . $previous_id . $checkbox_name_sufix ;
} else {
$checkbox_name = 'create_' . $sub_id . $checkbox_name_sufix ;
}
$previous_id = $checkbox_name_sufix ;
2019-02-20 13:55:21 +01:00
$status = ( ! empty ( $checked ) && isset ( $checked [ $level ]));
2019-04-09 18:33:02 +02:00
$output .= html_print_checkbox ( $checkbox_name , 0 , $status , true , false , '' ) . ' <span>' . $level . '</span>' ;
2019-01-30 16:18:44 +01:00
if ( isset ( $sub_level [ '__VALUE__' ])) {
2019-04-09 18:33:02 +02:00
$output .= '<span class="value" style="display: none;"> = ' . $sub_level [ '__VALUE__' ] . '</span>' ;
2019-01-30 16:18:44 +01:00
}
2019-04-09 18:33:02 +02:00
$output .= '</li>' ;
2019-01-30 16:18:44 +01:00
2019-02-20 08:52:29 +01:00
// Recursively print sub levels.
2019-04-09 18:33:02 +02:00
$output .= snmp_browser_print_tree (
$sub_level ,
$sub_id ,
( $depth + 1 ),
( $count == $total ? 1 : 0 ),
$last_array ,
$sufix ,
$checked ,
2019-04-11 15:05:03 +02:00
$return ,
$descriptive_ids ,
$previous_id
2019-04-09 18:33:02 +02:00
);
2019-01-30 16:18:44 +01:00
$count ++ ;
}
2019-04-09 18:33:02 +02:00
$output .= '</ul>' ;
if ( $return == false ) {
echo $output ;
}
return $output ;
2013-02-14 17:44:45 +01:00
}
2019-01-30 16:18:44 +01:00
2013-02-14 17:44:45 +01:00
/**
* Build the SNMP tree for the given SNMP agent .
*
* @ param target_ip string IP of the SNMP agent .
* @ param community string SNMP community to use .
*
* @ return array The SNMP tree .
*/
2019-03-04 15:33:36 +01:00
function snmp_browser_get_tree (
$target_ip ,
$community ,
$starting_oid = '.' ,
$version = '2c' ,
$snmp3_auth_user = '' ,
$snmp3_security_level = '' ,
$snmp3_auth_method = '' ,
$snmp3_auth_pass = '' ,
$snmp3_privacy_method = '' ,
$snmp3_privacy_pass = '' ,
$server_to_exec = 0
) {
2019-01-30 16:18:44 +01:00
global $config ;
if ( $target_ip == '' ) {
return __ ( 'Target IP cannot be blank.' );
}
// Call snmpwalk
if ( empty ( $config [ 'snmpwalk' ])) {
switch ( PHP_OS ) {
case 'FreeBSD' :
$snmpwalk_bin = '/usr/local/bin/snmpwalk' ;
break ;
case 'NetBSD' :
$snmpwalk_bin = '/usr/pkg/bin/snmpwalk' ;
break ;
default :
$snmpwalk_bin = 'snmpwalk' ;
break ;
}
} else {
$snmpwalk_bin = $config [ 'snmpwalk' ];
}
switch ( PHP_OS ) {
case 'WIN32' :
case 'WINNT' :
case 'Windows' :
$error_redir_dir = 'NUL' ;
break ;
default :
$error_redir_dir = '/dev/null' ;
break ;
}
if ( $server_to_exec != 0 ) {
$sql = sprintf ( 'SELECT ip_address FROM tserver WHERE id_server = %d' , $server_to_exec );
$server_data = db_get_row_sql ( $sql );
if ( enterprise_installed ()) {
enterprise_include_once ( 'include/functions_satellite.php' );
$oid_tree = [ '__LEAVES__' => []];
if ( $version == '3' ) {
switch ( $snmp3_security_level ) {
case 'authPriv' :
$command = $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -A ' . escapeshellarg ( $snmp3_auth_pass ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' -a ' . escapeshellarg ( $snmp3_auth_method ) . ' -x ' . escapeshellarg ( $snmp3_privacy_method ) . ' -X ' . escapeshellarg ( $snmp3_privacy_pass ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir ;
break ;
case 'authNoPriv' :
$command = $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -A ' . escapeshellarg ( $snmp3_auth_pass ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' -a ' . escapeshellarg ( $snmp3_auth_method ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir ;
break ;
case 'noAuthNoPriv' :
$command = $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir ;
break ;
}
} else {
$command = $snmpwalk_bin . ' -m ALL -M +' . escapeshellarg ( $config [ 'homedir' ] . '/attachment/mibs' ) . ' -Cc -c ' . escapeshellarg ( io_safe_output ( $community )) . ' -v ' . escapeshellarg ( $version ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir ;
}
exec ( 'ssh pandora_exec_proxy@' . $server_data [ 'ip_address' ] . ' "' . $command . '"' , $output , $rc );
} else {
$oid_tree = [ '__LEAVES__' => []];
if ( $version == '3' ) {
switch ( $snmp3_security_level ) {
case 'authPriv' :
exec ( $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -A ' . escapeshellarg ( $snmp3_auth_pass ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' -a ' . escapeshellarg ( $snmp3_auth_method ) . ' -x ' . escapeshellarg ( $snmp3_privacy_method ) . ' -X ' . escapeshellarg ( $snmp3_privacy_pass ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir , $output , $rc );
break ;
case 'authNoPriv' :
exec ( $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -A ' . escapeshellarg ( $snmp3_auth_pass ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' -a ' . escapeshellarg ( $snmp3_auth_method ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir , $output , $rc );
break ;
case 'noAuthNoPriv' :
exec ( $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir , $output , $rc );
break ;
}
} else {
exec ( $snmpwalk_bin . ' -m ALL -M +' . escapeshellarg ( $config [ 'homedir' ] . '/attachment/mibs' ) . ' -Cc -c ' . escapeshellarg ( io_safe_output ( $community )) . ' -v ' . escapeshellarg ( $version ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir , $output , $rc );
}
}
} else {
$oid_tree = [ '__LEAVES__' => []];
if ( $version == '3' ) {
switch ( $snmp3_security_level ) {
case 'authPriv' :
exec ( $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -A ' . escapeshellarg ( $snmp3_auth_pass ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' -a ' . escapeshellarg ( $snmp3_auth_method ) . ' -x ' . escapeshellarg ( $snmp3_privacy_method ) . ' -X ' . escapeshellarg ( $snmp3_privacy_pass ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir , $output , $rc );
break ;
case 'authNoPriv' :
exec ( $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -A ' . escapeshellarg ( $snmp3_auth_pass ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' -a ' . escapeshellarg ( $snmp3_auth_method ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir , $output , $rc );
break ;
case 'noAuthNoPriv' :
exec ( $snmpwalk_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir , $output , $rc );
break ;
}
} else {
exec ( $snmpwalk_bin . ' -m ALL -M +' . escapeshellarg ( $config [ 'homedir' ] . '/attachment/mibs' ) . ' -Cc -c ' . escapeshellarg ( io_safe_output ( $community )) . ' -v ' . escapeshellarg ( $version ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $starting_oid ) . ' 2> ' . $error_redir_dir , $output , $rc );
}
}
foreach ( $output as $line ) {
// Separate the OID from the value
$full_oid = explode ( '=' , $line );
if ( ! isset ( $full_oid [ 1 ])) {
continue ;
}
$oid = trim ( $full_oid [ 0 ]);
$value = trim ( $full_oid [ 1 ]);
// Parse the OID
$group = 0 ;
$sub_oid = '' ;
$ptr = & $oid_tree [ '__LEAVES__' ];
for ( $i = 0 ; $i < strlen ( $oid ); $i ++ ) {
// "X.Y.Z"
if ( $oid [ $i ] == '"' ) {
$group = ( $group ^ 1 );
}
// Move to the next element of the OID
if ( $group == 0 && ( $oid [ $i ] == '.' || ( $oid [ $i ] == ':' && $oid [( $i + 1 )] == ':' ))) {
// Skip the next :
if ( $oid [ $i ] == ':' ) {
$i ++ ;
}
// Starting dot
if ( $sub_oid == '' ) {
continue ;
}
if ( ! isset ( $ptr [ $sub_oid ]) || ! isset ( $ptr [ $sub_oid ][ '__LEAVES__' ])) {
$ptr [ $sub_oid ][ '__LEAVES__' ] = [];
}
$ptr = & $ptr [ $sub_oid ][ '__LEAVES__' ];
$sub_oid = '' ;
} else {
if ( $oid [ $i ] != '"' ) {
$sub_oid .= $oid [ $i ];
}
}
}
// The last element will contain the full OID
$ptr [ $sub_oid ] = [
'__OID__' => $oid ,
'__VALUE__' => $value ,
];
$ptr = & $ptr [ $sub_oid ];
$sub_oid = '' ;
}
return $oid_tree ;
2013-02-14 17:44:45 +01:00
}
2019-01-30 16:18:44 +01:00
2013-02-14 17:44:45 +01:00
/**
* Retrieve data for the specified OID .
*
2019-03-04 15:33:36 +01:00
* @ param string $target_ip IP of the SNMP agent .
* @ param string $community SNMP community to use .
* @ param string $target_oid SNMP OID to query .
* @ param string $version Version SNMP .
* @ param string $snmp3_auth_user User snmp3 .
* @ param string $snmp3_security_level Security level snmp3 .
* @ param string $snmp3_auth_method Method snmp3 .
* @ param string $snmp3_auth_pass Pass snmp3 .
* @ param string $snmp3_privacy_method Privicy method snmp3 .
* @ param string $snmp3_privacy_pass Pass Method snmp3 .
* @ param integer $server_to_exec Execute with other server .
2019-01-30 16:18:44 +01:00
*
2019-03-04 15:33:36 +01:00
* @ return mixed OID data .
2013-02-14 17:44:45 +01:00
*/
2019-03-04 15:33:36 +01:00
function snmp_browser_get_oid (
$target_ip ,
$community ,
$target_oid ,
$version = '2c' ,
$snmp3_auth_user = '' ,
$snmp3_security_level = '' ,
$snmp3_auth_method = '' ,
$snmp3_auth_pass = '' ,
$snmp3_privacy_method = '' ,
$snmp3_privacy_pass = '' ,
$server_to_exec = 0
) {
2019-01-30 16:18:44 +01:00
global $config ;
if ( $target_oid == '' ) {
return ;
}
$oid_data [ 'oid' ] = $target_oid ;
if ( empty ( $config [ 'snmpget' ])) {
switch ( PHP_OS ) {
case 'FreeBSD' :
$snmpget_bin = '/usr/local/bin/snmpget' ;
break ;
case 'NetBSD' :
$snmpget_bin = '/usr/pkg/bin/snmpget' ;
break ;
default :
$snmpget_bin = 'snmpget' ;
break ;
}
} else {
$snmpget_bin = $config [ 'snmpget' ];
}
switch ( PHP_OS ) {
case 'WIN32' :
case 'WINNT' :
case 'Windows' :
$error_redir_dir = 'NUL' ;
break ;
default :
$error_redir_dir = '/dev/null' ;
break ;
}
2019-03-04 15:33:36 +01:00
if ( $server_to_exec != 0 ) {
$sql = sprintf (
'SELECT ip_address FROM tserver WHERE id_server = %d' ,
$server_to_exec
);
$server_data = db_get_row_sql ( $sql );
if ( $version == '3' ) {
$command = $snmpget_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -A ' . escapeshellarg ( $snmp3_auth_pass ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' -a ' . escapeshellarg ( $snmp3_auth_method ) . ' -x ' . escapeshellarg ( $snmp3_privacy_method ) . ' -X ' . escapeshellarg ( $snmp3_privacy_pass ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $target_oid ) . ' 2> ' . $error_redir_dir ;
} else {
$command = $snmpget_bin . ' -m ALL -M +' . escapeshellarg ( $config [ 'homedir' ] . '/attachment/mibs' ) . ' -On -c ' . escapeshellarg ( io_safe_output ( $community )) . ' -v ' . escapeshellarg ( $version ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $target_oid ) . ' 2> ' . $error_redir_dir ;
}
exec (
'ssh pandora_exec_proxy@' . $server_data [ 'ip_address' ] . ' "' . $command . '"' ,
$output ,
$rc
);
2019-01-30 16:18:44 +01:00
} else {
2019-03-04 15:33:36 +01:00
if ( $version == '3' ) {
exec (
$snmpget_bin . ' -m ALL -v 3 -u ' . escapeshellarg ( $snmp3_auth_user ) . ' -A ' . escapeshellarg ( $snmp3_auth_pass ) . ' -l ' . escapeshellarg ( $snmp3_security_level ) . ' -a ' . escapeshellarg ( $snmp3_auth_method ) . ' -x ' . escapeshellarg ( $snmp3_privacy_method ) . ' -X ' . escapeshellarg ( $snmp3_privacy_pass ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $target_oid ) . ' 2> ' . $error_redir_dir ,
$output ,
$rc
);
} else {
exec (
$snmpget_bin . ' -m ALL -M +' . escapeshellarg ( $config [ 'homedir' ] . '/attachment/mibs' ) . ' -On -c ' . escapeshellarg ( io_safe_output ( $community )) . ' -v ' . escapeshellarg ( $version ) . ' ' . escapeshellarg ( $target_ip ) . ' ' . escapeshellarg ( $target_oid ) . ' 2> ' . $error_redir_dir ,
$output ,
$rc
);
}
2019-01-30 16:18:44 +01:00
}
if ( $rc != 0 ) {
return $oid_data ;
}
foreach ( $output as $line ) {
2019-03-04 15:33:36 +01:00
// Separate the OID from the value.
2019-01-30 16:18:44 +01:00
$full_oid = explode ( '=' , $line );
if ( ! isset ( $full_oid [ 1 ])) {
break ;
}
$oid = trim ( $full_oid [ 0 ]);
$oid_data [ 'numeric_oid' ] = $oid ;
2019-03-04 15:33:36 +01:00
// Translate the OID.
2019-01-30 16:18:44 +01:00
if ( empty ( $config [ 'snmptranslate' ])) {
switch ( PHP_OS ) {
case 'FreeBSD' :
$snmptranslate_bin = '/usr/local/bin/snmptranslate' ;
break ;
case 'NetBSD' :
$snmptranslate_bin = '/usr/pkg/bin/snmptranslate' ;
break ;
default :
$snmptranslate_bin = 'snmptranslate' ;
break ;
}
} else {
$snmptranslate_bin = $config [ 'snmptranslate' ];
}
2019-03-04 15:33:36 +01:00
if ( $server_to_exec != 0 ) {
$command_output = $snmptranslate_bin . ' -m ALL -M +' . escapeshellarg ( $config [ 'homedir' ] . '/attachment/mibs' ) . ' -Td ' . escapeshellarg ( $oid );
exec (
'ssh pandora_exec_proxy@' . $server_data [ 'ip_address' ] . ' "' . $command_output . '"' ,
$translate_output ,
$rc
);
} else {
exec (
$snmptranslate_bin . ' -m ALL -M +' . escapeshellarg ( $config [ 'homedir' ] . '/attachment/mibs' ) . ' -Td ' . escapeshellarg ( $oid ),
$translate_output
);
}
2019-01-30 16:18:44 +01:00
foreach ( $translate_output as $line ) {
if ( preg_match ( '/SYNTAX\s+(.*)/' , $line , $matches ) == 1 ) {
$oid_data [ 'syntax' ] = $matches [ 1 ];
} else if ( preg_match ( '/MAX-ACCESS\s+(.*)/' , $line , $matches ) == 1 ) {
$oid_data [ 'max_access' ] = $matches [ 1 ];
} else if ( preg_match ( '/STATUS\s+(.*)/' , $line , $matches ) == 1 ) {
$oid_data [ 'status' ] = $matches [ 1 ];
} else if ( preg_match ( '/DISPLAY\-HINT\s+(.*)/' , $line , $matches ) == 1 ) {
$oid_data [ 'display_hint' ] = $matches [ 1 ];
}
}
2019-03-04 15:33:36 +01:00
// Parse the description. First search for it in custom values.
2019-01-30 16:18:44 +01:00
$custom_data = db_get_row ( 'ttrap_custom_values' , 'oid' , $oid );
if ( $custom_data === false ) {
$translate_output = implode ( '' , $translate_output );
if ( preg_match ( '/DESCRIPTION\s+\"(.*)\"/' , $translate_output , $matches ) == 1 ) {
$oid_data [ 'description' ] = $matches [ 1 ];
}
} else {
$oid_data [ 'description' ] = $custom_data [ 'description' ];
}
$full_value = explode ( ':' , trim ( $full_oid [ 1 ]));
if ( ! isset ( $full_value [ 1 ])) {
$oid_data [ 'value' ] = trim ( $full_oid [ 1 ]);
} else {
$oid_data [ 'type' ] = trim ( $full_value [ 0 ]);
$oid_data [ 'value' ] = trim ( $full_value [ 1 ]);
}
return $oid_data ;
}
2013-02-14 17:44:45 +01:00
}
2019-01-30 16:18:44 +01:00
2013-02-14 17:44:45 +01:00
/**
* Print the given OID data .
*
2013-02-22 14:11:47 +01:00
* @ param oid array OID data .
* @ param custom_action string A custom action added to next to the close button .
* @ param bool return The result is printed if set to true or returned if set to false .
2019-01-30 16:18:44 +01:00
*
2013-02-22 14:11:47 +01:00
* @ return string The OID data .
2013-02-14 17:44:45 +01:00
*/
2019-01-30 16:18:44 +01:00
function snmp_browser_print_oid (
$oid = [],
$custom_action = '' ,
$return = false ,
$community = '' ,
$snmp_version = 1
) {
$output = '' ;
// OID information table
$table -> width = '100%' ;
$table -> size = [];
$table -> data = [];
foreach ([ 'oid' , 'numeric_oid' , 'value' ] as $key ) {
if ( ! isset ( $oid [ $key ])) {
$oid [ $key ] = '' ;
}
}
$table -> data [ 0 ][ 0 ] = '<strong>' . __ ( 'OID' ) . '</strong>' ;
$table -> data [ 0 ][ 1 ] = $oid [ 'oid' ];
$table -> data [ 1 ][ 0 ] = '<strong>' . __ ( 'Numeric OID' ) . '</strong>' ;
$table -> data [ 1 ][ 1 ] = '<span id="snmp_selected_oid">' . $oid [ 'numeric_oid' ] . '</span>' ;
$table -> data [ 2 ][ 0 ] = '<strong>' . __ ( 'Value' ) . '</strong>' ;
$table -> data [ 2 ][ 1 ] = $oid [ 'value' ];
$i = 3 ;
if ( isset ( $oid [ 'type' ])) {
$table -> data [ $i ][ 0 ] = '<strong>' . __ ( 'Type' ) . '</strong>' ;
$table -> data [ $i ][ 1 ] = $oid [ 'type' ];
$i ++ ;
}
if ( isset ( $oid [ 'description' ])) {
$table -> data [ $i ][ 0 ] = '<strong>' . __ ( 'Description' ) . '</strong>' ;
$table -> data [ $i ][ 1 ] = $oid [ 'description' ];
$i ++ ;
}
if ( isset ( $oid [ 'syntax' ])) {
$table -> data [ $i ][ 0 ] = '<strong>' . __ ( 'Syntax' ) . '</strong>' ;
$table -> data [ $i ][ 1 ] = $oid [ 'syntax' ];
$i ++ ;
}
if ( isset ( $oid [ 'display_hint' ])) {
$table -> data [ $i ][ 0 ] = '<strong>' . __ ( 'Display hint' ) . '</strong>' ;
$table -> data [ $i ][ 1 ] = $oid [ 'display_hint' ];
$i ++ ;
}
if ( isset ( $oid [ 'max_access' ])) {
$table -> data [ $i ][ 0 ] = '<strong>' . __ ( 'Max access' ) . '</strong>' ;
$table -> data [ $i ][ 1 ] = $oid [ 'max_access' ];
$i ++ ;
}
if ( isset ( $oid [ 'status' ])) {
$table -> data [ $i ][ 0 ] = '<strong>' . __ ( 'Status' ) . '</strong>' ;
$table -> data [ $i ][ 1 ] = $oid [ 'status' ];
$i ++ ;
}
$closer = '<a href="javascript:" onClick="hideOIDData();">' ;
$closer .= html_print_image ( 'images/blade.png' , true , [ 'title' => __ ( 'Close' ), 'style' => 'vertical-align: middle;' ], false );
$closer .= '</a>' ;
// Add a span for custom actions
if ( $custom_action != '' ) {
$table -> head [ 0 ] = '<span id="snmp_custom_action">' . $closer . $custom_action . '</span>' ;
} else {
$table -> head [ 0 ] = $closer ;
}
$table -> head [ 1 ] = __ ( 'OID Information' );
$output .= html_print_table ( $table , true );
$url = 'index.php?' . 'sec=gmodules&' . 'sec2=godmode/modules/manage_network_components' ;
$output .= '<form style="text-align: center; margin: 10px" method="post" action="' . $url . '">' ;
$output .= html_print_input_hidden ( 'create_network_from_snmp_browser' , 1 , true );
$output .= html_print_input_hidden ( 'id_component_type' , 2 , true );
$output .= html_print_input_hidden ( 'type' , 17 , true );
$name = '' ;
if ( ! empty ( $oid [ 'oid' ])) {
$name = $oid [ 'oid' ];
}
$output .= html_print_input_hidden ( 'name' , $name , true );
$description = '' ;
if ( ! empty ( $oid [ 'description' ])) {
$description = $oid [ 'description' ];
}
$output .= html_print_input_hidden ( 'description' , $description , true );
$output .= html_print_input_hidden ( 'snmp_oid' , $oid [ 'numeric_oid' ], true );
$output .= html_print_input_hidden ( 'snmp_community' , $community , true );
$output .= html_print_input_hidden ( 'snmp_version' , $snmp_version , true );
$output .= html_print_submit_button (
__ ( 'Create network component' ),
'' ,
false ,
'class="sub add"' ,
true
);
$output .= '</form>' ;
if ( $return ) {
return $output ;
}
echo $output ;
2013-02-22 14:11:47 +01:00
}
2019-01-30 16:18:44 +01:00
2013-02-22 14:11:47 +01:00
/**
* Print the div that contains the SNMP browser .
*
* @ param bool return The result is printed if set to true or returned if set to false .
* @ param string width Width of the SNMP browser . Units must be specified .
* @ param string height Height of the SNMP browser . Units must be specified .
* @ param string display CSS display value for the container div . Set to none to hide the div .
2019-01-30 16:18:44 +01:00
*
2013-02-22 14:11:47 +01:00
* @ return string The container div .
*/
2019-01-30 16:18:44 +01:00
function snmp_browser_print_container ( $return = false , $width = '100%' , $height = '500px' , $display = '' )
{
// Target selection
$table = new stdClass ();
$table -> width = '100%' ;
$table -> class = 'databox filters' ;
$table -> size = [];
$table -> data = [];
$table -> data [ 0 ][ 0 ] = '<strong>' . __ ( 'Target IP' ) . '</strong> ' ;
$table -> data [ 0 ][ 0 ] .= html_print_input_text ( 'target_ip' , '' , '' , 25 , 0 , true );
$table -> data [ 0 ][ 1 ] = '<strong>' . __ ( 'Community' ) . '</strong> ' ;
$table -> data [ 0 ][ 1 ] .= html_print_input_text ( 'community' , '' , '' , 25 , 0 , true );
$table -> data [ 0 ][ 2 ] = '<strong>' . __ ( 'Starting OID' ) . '</strong> ' ;
$table -> data [ 0 ][ 2 ] .= html_print_input_text ( 'starting_oid' , '.1.3.6.1.2' , '' , 25 , 0 , true );
$table -> data [ 1 ][ 0 ] = '<strong>' . __ ( 'Version' ) . '</strong> ' ;
$table -> data [ 1 ][ 0 ] .= html_print_select (
[
'1' => 'v. 1' ,
'2' => 'v. 2' ,
'2c' => 'v. 2c' ,
'3' => 'v. 3' ,
],
'snmp_browser_version' ,
'' ,
'checkSNMPVersion();' ,
'' ,
'' ,
true ,
false ,
false ,
''
);
$servers_to_exec = [];
$servers_to_exec [ 0 ] = __ ( 'Local console' );
if ( enterprise_installed ()) {
enterprise_include_once ( 'include/functions_satellite.php' );
$rows = get_proxy_servers ();
if ( $rows !== false ) {
foreach ( $rows as $row ) {
if ( $row [ 'server_type' ] != 13 ) {
$s_type = ' (Standard)' ;
} else {
$s_type = ' (Satellite)' ;
}
$servers_to_exec [ $row [ 'id_server' ]] = $row [ 'name' ] . $s_type ;
}
}
}
$table -> data [ 1 ][ 1 ] = '<strong>' . __ ( 'Server to execute' ) . '</strong> ' ;
$table -> data [ 1 ][ 1 ] .= html_print_select ( $servers_to_exec , 'server_to_exec' , '' , '' , '' , '' , true );
$table -> data [ 1 ][ 2 ] = html_print_button ( __ ( 'Browse' ), 'browse' , false , 'snmpBrowse()' , 'class="sub search" style="margin-top:0px;"' , true );
// SNMP v3 options
$table3 = new stdClass ();
$table3 -> width = '100%' ;
$table3 -> valign [ 0 ] = '' ;
$table3 -> valign [ 1 ] = '' ;
$table3 -> data [ 2 ][ 1 ] = '<b>' . __ ( 'Auth user' ) . '</b>' ;
$table3 -> data [ 2 ][ 2 ] = html_print_input_text ( 'snmp3_browser_auth_user' , '' , '' , 15 , 60 , true );
$table3 -> data [ 2 ][ 3 ] = '<b>' . __ ( 'Auth password' ) . '</b>' ;
$table3 -> data [ 2 ][ 4 ] = html_print_input_password ( 'snmp3_browser_auth_pass' , '' , '' , 15 , 60 , true );
$table3 -> data [ 2 ][ 4 ] .= html_print_input_hidden_extended ( 'active_snmp_v3' , 0 , 'active_snmp_v3_fsb' , true );
$table3 -> data [ 5 ][ 0 ] = '<b>' . __ ( 'Privacy method' ) . '</b>' ;
$table3 -> data [ 5 ][ 1 ] = html_print_select ([ 'DES' => __ ( 'DES' ), 'AES' => __ ( 'AES' )], 'snmp3_browser_privacy_method' , '' , '' , '' , '' , true );
$table3 -> data [ 5 ][ 2 ] = '<b>' . __ ( 'Privacy pass' ) . '</b>' ;
$table3 -> data [ 5 ][ 3 ] = html_print_input_password ( 'snmp3_browser_privacy_pass' , '' , '' , 15 , 60 , true );
$table3 -> data [ 6 ][ 0 ] = '<b>' . __ ( 'Auth method' ) . '</b>' ;
$table3 -> data [ 6 ][ 1 ] = html_print_select ([ 'MD5' => __ ( 'MD5' ), 'SHA' => __ ( 'SHA' )], 'snmp3_browser_auth_method' , '' , '' , '' , '' , true );
$table3 -> data [ 6 ][ 2 ] = '<b>' . __ ( 'Security level' ) . '</b>' ;
$table3 -> data [ 6 ][ 3 ] = html_print_select (
[
'noAuthNoPriv' => __ ( 'Not auth and not privacy method' ),
'authNoPriv' => __ ( 'Auth and not privacy method' ),
'authPriv' => __ ( 'Auth and privacy method' ),
],
'snmp3_browser_security_level' ,
'' ,
'' ,
'' ,
'' ,
true
);
// Search tools
$table2 = new stdClass ();
$table2 -> width = '100%' ;
$table2 -> class = 'databox filters' ;
$table2 -> size = [];
$table2 -> data = [];
$table2 -> data [ 0 ][ 0 ] = html_print_input_text ( 'search_text' , '' , '' , 25 , 0 , true );
$table2 -> data [ 0 ][ 0 ] .= '<a href="javascript:">' . html_print_image ( 'images/zoom.png' , true , [ 'title' => __ ( 'Search' ), 'style' => 'vertical-align: middle;' , 'onclick' => 'searchText();' ]) . '</a>' ;
$table2 -> data [ 0 ][ 1 ] = ' ' . '<a href="javascript:">' . html_print_image ( 'images/go_first.png' , true , [ 'title' => __ ( 'First match' ), 'style' => 'vertical-align: middle;' , 'onclick' => 'searchFirstMatch();' ]) . '</a>' ;
$table2 -> data [ 0 ][ 1 ] .= ' ' . '<a href="javascript:">' . html_print_image ( 'images/go_previous.png' , true , [ 'title' => __ ( 'Previous match' ), 'style' => 'vertical-align: middle;' , 'onclick' => 'searchPrevMatch();' ]) . '</a>' ;
$table2 -> data [ 0 ][ 1 ] .= ' ' . '<a href="javascript:">' . html_print_image ( 'images/go_next.png' , true , [ 'title' => __ ( 'Next match' ), 'style' => 'vertical-align: middle;' , 'onclick' => 'searchNextMatch();' ]) . '</a>' ;
$table2 -> data [ 0 ][ 1 ] .= ' ' . '<a href="javascript:">' . html_print_image ( 'images/go_last.png' , true , [ 'title' => __ ( 'Last match' ), 'style' => 'vertical-align: middle;' , 'onclick' => 'searchLastMatch();' ]) . '</a>' ;
$table2 -> cellstyle [ 0 ][ 1 ] = 'text-align:center;' ;
$table2 -> data [ 0 ][ 2 ] = ' ' . '<a href="javascript:">' . html_print_image (
'images/expand.png' ,
true ,
[
'title' => __ ( 'Expand the tree (can be slow)' ),
'style' => 'vertical-align: middle;' ,
'onclick' => 'expandAll();' ,
]
) . '</a>' ;
$table2 -> data [ 0 ][ 2 ] .= ' ' . '<a href="javascript:">' . html_print_image ( 'images/collapse.png' , true , [ 'title' => __ ( 'Collapse the tree' ), 'style' => 'vertical-align: middle;' , 'onclick' => 'collapseAll();' ]) . '</a>' ;
$table2 -> cellstyle [ 0 ][ 2 ] = 'text-align:center;' ;
// This extra div that can be handled by jquery's dialog
$output = '<div id="snmp_browser_container" style="display:' . $display . '">' ;
$output .= '<div style="text-align: left; width: ' . $width . '; height: ' . $height . ';">' ;
$output .= '<div style="width: 100%">' ;
$output .= html_print_table ( $table , true );
$output .= '</div>' ;
if ( ! isset ( $snmp_version )) {
$snmp_version = null ;
}
if ( $snmp_version == 3 ) {
$output .= '<div id="snmp3_browser_options">' ;
} else {
$output .= '<div id="snmp3_browser_options" style="display: none;">' ;
}
$output .= ui_toggle ( html_print_table ( $table3 , true ), __ ( 'SNMP v3 options' ), '' , true , true );
$output .= '</div>' ;
$output .= '<div style="width: 100%; padding-top: 10px;">' ;
$output .= ui_toggle ( html_print_table ( $table2 , true ), __ ( 'Search options' ), '' , true , true );
$output .= '</div>' ;
// SNMP tree container
$output .= '<div style="width: 100%; height: 100%; margin-top: 5px; position: relative;">' ;
$output .= html_print_input_hidden ( 'search_count' , 0 , true );
$output .= html_print_input_hidden ( 'search_index' , - 1 , true );
// Save some variables for javascript functions
$output .= html_print_input_hidden ( 'ajax_url' , ui_get_full_url ( 'ajax.php' ), true );
$output .= html_print_input_hidden ( 'search_matches_translation' , __ ( 'Search matches' ), true );
$output .= '<div id="search_results" style="display: none; padding: 5px; background-color: #EAEAEA; border: 1px solid #E2E2E2; border-radius: 4px;"></div>' ;
$output .= '<div id="spinner" style="position: absolute; top:0; left:0px; display:none; padding: 5px;">' . html_print_image ( 'images/spinner.gif' , true ) . '</div>' ;
$output .= '<div id="snmp_browser" style="height: 100%; overflow: auto; background-color: #F4F5F4; border: 1px solid #E2E2E2; border-radius: 4px; padding: 5px;"></div>' ;
$output .= '<div class="databox" id="snmp_data" style="margin: 5px;"></div>' ;
$output .= '</div>' ;
$output .= '</div>' ;
$output .= '</div>' ;
if ( $return ) {
return $output ;
}
echo $output ;
2013-02-14 17:44:45 +01:00
}
2013-02-22 14:11:47 +01:00
2019-01-30 16:18:44 +01:00
2013-02-22 14:11:47 +01:00
?>
2017-06-15 15:12:27 +02:00
< script type = " text/javascript " >
2019-01-30 16:18:44 +01:00
$ ( document ) . ready ( function () {
$ ( 'input[name*=create_network_component]' ) . click ( function () {
var id_check = $ ( '#ul_0' ) . find ( 'input' ) . map ( function (){
if ( this . id . indexOf ( 'checkbox-create_' ) !=- 1 ){
if ( $ ( this ) . is ( ':checked' )){
return this . id ;
}
} }) . get ();
$ ( 'input[name*=create_network_component]' ) . removeClass ( " sub add " );
$ ( 'input[name*=create_network_component]' ) . addClass ( " sub spinn " );
var target_ip = $ ( '#text-target_ip' ) . val ();
var community = $ ( '#text-community' ) . val ();
var snmp_version = $ ( '#snmp_browser_version' ) . val ();
var snmp3_auth_user = $ ( '#text-snmp3_browser_auth_user' ) . val ();
var snmp3_security_level = $ ( '#snmp3_browser_security_level' ) . val ();
var snmp3_auth_method = $ ( '#snmp3_browser_auth_method' ) . val ();
var snmp3_auth_pass = $ ( '#password-snmp3_browser_auth_pass' ) . val ();
var snmp3_privacy_method = $ ( '#snmp3_browser_privacy_method' ) . val ();
var snmp3_privacy_pass = $ ( '#password-snmp3_browser_privacy_pass' ) . val ();
var custom_action = $ ( '#hidden-custom_action' ) . val ();
if ( custom_action == undefined ) {
custom_action = '' ;
}
var oids = [];
id_check . forEach ( function ( product , index ) {
var oid = $ ( " # " + product ) . siblings ( 'a' ) . attr ( 'href' );
if ( oid . indexOf ( 'javascript: snmpGet("' ) !=- 1 ) {
oid = oid . replace ( 'javascript: snmpGet("' , " " );
oid = oid . replace ( '");' , " " );
oids . push ( oid );
}
});
// Prepare the AJAX call
var params = {};
params [ " target_ip " ] = target_ip ;
params [ " community " ] = community ;
params [ " oids " ] = oids ;
params [ " snmp_browser_version " ] = snmp_version ;
params [ " snmp3_browser_auth_user " ] = snmp3_auth_user ;
params [ " snmp3_browser_security_level " ] = snmp3_security_level ;
params [ " snmp3_browser_auth_method " ] = snmp3_auth_method ;
params [ " snmp3_browser_auth_pass " ] = snmp3_auth_pass ;
params [ " snmp3_browser_privacy_method " ] = snmp3_privacy_method ;
params [ " snmp3_browser_privacy_pass " ] = snmp3_privacy_pass ;
params [ " action " ] = " create_modules_snmp " ;
params [ " custom_action " ] = custom_action ;
params [ " page " ] = " include/ajax/snmp_browser.ajax " ;
$ . ajax ({
type : " GET " ,
url : " ajax.php " ,
data : params ,
dataType : " html " ,
success : function ( data ) {
var dato = data . replace ( / [ ^ ] + ( ? = \ [) / , " " );
$ ( 'input[name*=create_network_component]' ) . removeClass ( " sub spinn " );
$ ( 'input[name*=create_network_component]' ) . addClass ( " sub add " );
dato = JSON . parse ( dato );
if ( dato . length !== 0 ){
$ ( '#error_text' ) . text ( " " );
dato . forEach ( function ( valor , indice , array ) {
$ ( '#error_text' ) . append ( '<br/>' + valor );
});
$ ( " #dialog_error " )
. dialog ({
resizable : true ,
draggable : true ,
modal : true ,
height : 300 ,
width : 500 ,
overlay : {
opacity : 0.5 ,
background : " black "
}
});
} else {
$ ( " #dialog_success " )
. dialog ({
resizable : true ,
draggable : true ,
modal : true ,
height : 250 ,
width : 500 ,
overlay : {
opacity : 0.5 ,
background : " black "
}
});
}
}
});
});
$ ( 'input[id^=checkbox-create]' ) . change ( function () {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( 'input[name*=create_network_component]' ) . show ();
var id_input = $ ( this ) . attr ( " id " );
2019-02-19 20:14:14 +01:00
id_input = id_input . match ( " checkbox-create_([0-9]+) " );
2019-01-30 16:18:44 +01:00
var checks = $ ( '#ul_' + id_input [ 1 ]) . find ( 'input' ) . map ( function (){
if ( this . id . indexOf ( 'checkbox-create_' ) !=- 1 ){
return this . id ;
} }) . get ();
checks . forEach ( function ( product , index ) {
$ ( " # " + product ) . prop ( 'checked' , " true " );
});
} else {
var id_input = $ ( this ) . attr ( " id " );
2019-02-19 20:14:14 +01:00
id_input = id_input . match ( " checkbox-create_([0-9]+) " );
2019-01-30 16:18:44 +01:00
var checks = $ ( '#ul_' + id_input [ 1 ]) . find ( 'input' ) . map ( function (){
if ( this . id . indexOf ( 'checkbox-create_' ) !=- 1 ){
return this . id ;
} }) . get ();
checks . forEach ( function ( product , index ) {
$ ( " # " + product ) . prop ( 'checked' , false );
});
}
});
});
2017-06-15 15:12:27 +02:00
</ script >