2023-04-19 19:21:38 +02:00
< ? php
/**
* Agent deploy wizard
*
* @ category Class
* @ package Pandora FMS
* @ subpackage Agent deploy wizard
* @ version 1.0 . 0
* @ license See below
*
* ______ ___ _______ _______ ________
* | __ \ .-----.--.--.--| |.-----.----.-----. | ___ | | | __ |
* | __ /| _ | | _ || _ | _ | _ | | ___ | | __ |
* | ___ | | ___ . _ | __ | __ | _____ || _____ | __ | | ___ . _ | | ___ | | __ | _ | __ | _______ |
*
* ============================================================================
2023-06-08 11:53:13 +02:00
* Copyright ( c ) 2005 - 2023 Pandora FMS
2023-04-19 19:21:38 +02:00
* 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 .
* ============================================================================
*/
global $config ;
/**
* Provides functionality for agent deploy wizard .
*/
class AgentDeployWizard
{
/**
* Url of controller .
*
* @ var string
*/
public $ajaxController ;
/**
* References datatables object identifier .
*
* @ var string
*/
public $tableId ;
/**
* Allowed methods to be called using AJAX request .
*
* @ var array
*/
2023-04-25 09:16:48 +02:00
public $AJAXMethods = [ 'loadModal' ];
2023-04-19 19:21:38 +02:00
/**
* Checks if target method is available to be called using AJAX .
*
* @ param string $method Target method .
*
* @ return boolean True allowed , false not .
*/
public function ajaxMethod ( $method )
{
return in_array ( $method , $this -> AJAXMethods );
}
/**
* Generates a JSON error .
*
* @ param string $msg Error message .
*
* @ return void
*/
public function error ( $msg )
{
echo json_encode (
[ 'error' => $msg ]
);
}
/**
* Minor function to dump json message as ajax response .
*
* @ param string $type Type : result || error .
* @ param string $msg Message .
* @ param boolean $delete Deletion messages .
*
* @ return void
*/
private function ajaxMsg ( $type , $msg , $delete = false )
{
if ( $type === 'error' ) {
$msg_title = ( $delete === true ) ? 'Failed while removing' : 'Failed while saving' ;
} else {
$msg_title = ( $delete === true ) ? 'Successfully deleted' : 'Successfully saved into keystore' ;
}
echo json_encode (
[ $type => __ ( $msg_title ) . ':<br>' . $msg ]
);
exit ;
}
/**
* Initializes object and validates user access .
*
* @ param string $ajax_controller Path of ajaxController , is the 'page'
* variable sent in ajax calls .
*
* @ return object
*/
public function __construct ( $ajax_controller )
{
global $config ;
// Check access.
check_login ();
if (( bool ) check_acl ( $config [ 'id_user' ], 0 , 'AR' ) === false ) {
db_pandora_audit (
AUDIT_LOG_ACL_VIOLATION ,
'Trying to access agent deploy wizard'
);
if ( is_ajax ()) {
echo json_encode ([ 'error' => 'noaccess' ]);
} else {
include 'general/noaccess.php' ;
}
exit ;
}
$this -> ajaxController = $ajax_controller ;
return $this ;
}
/**
* Prints inputs for modal " Deploy agents " .
*
* @ return void
*/
public function loadModal ()
{
ob_start ();
echo '<div id="wizard-modal-content">' ;
echo $this -> getModalContent ();
echo '</div>' ;
echo ob_get_clean ();
}
/**
* Run AgentDeployWizard .
*
* @ return void
*/
public function run ()
{
global $config ;
if ( check_acl ( $config [ 'id_user' ], 0 , 'AR' ) === false ) {
db_pandora_audit (
AUDIT_LOG_ACL_VIOLATION ,
'Trying to access agent deploy.'
);
include 'general/noaccess.php' ;
return ;
}
ui_require_css_file ( 'agent_deploy_wizard' );
// Auxiliar div for agent deploy modal.
echo '<div id="agent_deploy_modal" class="invisible"></div>' ;
echo $this -> loadJS ();
}
/**
* Generates content of modal .
*
2023-04-19 19:25:22 +02:00
* @ return string Modal content .
2023-04-19 19:21:38 +02:00
*/
public function getModalContent ()
{
global $config ;
ob_start ();
$inputs = [];
// Container div for stepper.
$stepper_container = html_print_div (
[
'id' => 'stepper_container' ,
'class' => 'stepper' ,
],
true
);
html_print_div (
[
'id' => 'modal_header' ,
'class' => 'margin-bottom-10' ,
'content' => $stepper_container ,
]
);
// Deploy configuration.
$tableConfiguration = new stdClass ();
$tableConfiguration -> class = 'filter-table-adv w100p' ;
$tableConfiguration -> data = [];
$tableConfiguration -> style = [];
$tableConfiguration -> cellclass = [];
$tableConfiguration -> colspan = [];
$tableConfiguration -> rowclass [ 'os' ] = 'margin-bottom-5' ;
$tableConfiguration -> rowstyle [ 'block2' ] = 'display: flex; justify-content: space-between;' ;
$tableConfiguration -> rowspan = [];
$windows_label_img = html_print_image (
2023-04-20 10:01:35 +02:00
'/images/windows-grey@svg.svg' ,
2023-04-19 19:21:38 +02:00
true ,
[ 'class' => 'installer-title-icon main_menu_icon' ]
);
$windows_label = html_print_div (
[
'style' => 'display: flex;align-items: center; margin-top: 5px;margin-bottom: 5px;' ,
'content' => $windows_label_img . 'Windows' ,
],
true
);
$linux_label_img = html_print_image (
2023-04-20 10:01:35 +02:00
'/images/linux-grey@svg.svg' ,
2023-04-19 19:21:38 +02:00
true ,
[ 'class' => 'installer-title-icon main_menu_icon' ]
);
$linux_label = html_print_div (
[
'style' => 'display: flex;align-items: center; margin-top: 5px;margin-bottom: 5px;' ,
'content' => $linux_label_img . 'Unix / Linux' ,
],
true
);
$mac_label_img = html_print_image (
2023-04-20 10:01:35 +02:00
'/images/apple-grey@svg.svg' ,
2023-04-19 19:21:38 +02:00
true ,
[ 'class' => 'installer-title-icon main_menu_icon' ]
);
$mac_label = html_print_div (
[
'style' => 'display: flex;align-items: center; margin-top: 5px;margin-bottom: 5px;' ,
'content' => $mac_label_img . 'Mac OS' ,
],
true
);
// Operating System switch buttons.
$switchButtons = [];
$switchButtons [] = html_print_radio_button_extended (
'os' ,
0 ,
$windows_label ,
0 ,
false ,
'' ,
'' ,
true
);
$switchButtons [] = html_print_radio_button_extended (
'os' ,
1 ,
$linux_label ,
0 ,
false ,
'' ,
'' ,
true
);
$switchButtons [] = html_print_radio_button_extended (
'os' ,
2 ,
$mac_label ,
0 ,
false ,
'' ,
'' ,
true
);
$sub_tip = '<span class="input_sub_placeholder_normal">' . __ ( 'Please note that all OS must be 64-bit based architecture' ) . '</span>' ;
$tableConfiguration -> data [ 'os' ][] = html_print_label_input_block (
__ ( 'Choose your OS' ),
html_print_div (
[
'id' => 'os_selector' ,
2023-04-20 10:01:35 +02:00
'class' => 'switch_radio_button custom-switch-radio-button' ,
2023-04-19 19:21:38 +02:00
'content' => implode ( '' , $switchButtons ),
],
true
) . $sub_tip
);
$server_add_help_tip = ui_print_help_tip (
__ ( 'Use your %s Data Server IP address here. It must be possible to establish a connection from the agent to port 41121/tcp of this address.' , get_product_name ()),
true
);
$tableConfiguration -> data [ 'block2' ][ 0 ] = html_print_label_input_block (
__ ( 'Server address' ) . $server_add_help_tip ,
html_print_input_text (
'server_addr' ,
$_SERVER [ 'SERVER_ADDR' ],
'' ,
16 ,
100 ,
true ,
false ,
true ,
'' ,
'w260px'
)
);
$tableConfiguration -> data [ 'block2' ][ 1 ] = html_print_label_input_block (
__ ( 'Group' ),
html_print_select_groups (
false ,
'AR' ,
false ,
'group' ,
$group ,
'' ,
'' ,
0 ,
true ,
false ,
true ,
'w260px' ,
false ,
'' ,
'' ,
false ,
'id_grupo' ,
false ,
false ,
false ,
'260px' ,
false ,
true ,
)
);
echo '<div id="config_page">' ;
echo '<form id="form_generate_installer" method="post" action="index.php?sec=gagente&sec2=godmode/agentes/agent_deploy">' ;
if ( $config [ 'language' ] === 'es' ) {
$instructions_url = 'https://pandorafms.com/manual/es/documentation/02_installation/05_configuration_agents' ;
} else {
$instructions_url = 'https://pandorafms.com/manual/en/documentation/02_installation/05_configuration_agents' ;
}
$instructions_link = '<a class="green-link" style="font-size: 15px;" href="' . $instructions_url . '" target="_blank">' . __ ( 'view the following instructions' ) . '</a>' ;
$more_info_link = html_print_div (
[
'id' => 'config_form_more_info' ,
'class' => 'warn-box' ,
'content' => __ ( 'If you need more information regarding agents' ) . ', ' . $instructions_link ,
],
true
);
$table_config = html_print_div (
[
'style' => 'flex: 1;' ,
'content' => html_print_table ( $tableConfiguration , true ),
],
true
);
html_print_div (
[
'id' => 'config_form' ,
'class' => 'white_table_flex agent_details_col modal-content' ,
'content' => $table_config . $more_info_link ,
]
);
html_print_div (
[ 'id' => 'footer_separator' ]
);
html_print_div (
[
'id' => 'config_buttonset' ,
'class' => 'ui-dialog-buttonset' ,
'content' => html_print_submit_button (
__ ( 'Generate installer' ),
'generate_installer' ,
false ,
[],
true ,
2023-04-25 09:16:48 +02:00
),
2023-04-19 19:21:38 +02:00
]
);
echo '</form>' ;
echo '</div>' ;
echo '<div id="installer_page">' ;
echo '<div id="installer_data" class="white_table_flex agent_details_col modal-content">' ;
// Start of Unix / Linux installer section.
$title = html_print_image (
2023-04-20 10:01:35 +02:00
'/images/linux-grey@svg.svg' ,
2023-04-19 19:21:38 +02:00
true ,
2023-04-20 10:01:35 +02:00
[ 'class' => 'installer-title-icon main_menu_icon svg-brightness-0' ]
2023-04-19 19:21:38 +02:00
);
$title .= '<span class="header_title">' . __ ( 'Linux agent' ) . '</span>' ;
$content = html_print_div (
[
'class' => 'installer-title' ,
'content' => $title ,
],
true
);
$content .= '<span>' . __ ( 'Run the following command in the shell of your Linux server to perform the installation of the generated agent:' ) . '</span>' ;
$content .= html_print_code_picker ( 'run_command_box_linux' , '' , 'installer-code-fragment' , false , true );
$content .= '<span>' . __ ( 'Once installed, you must run the following command to start the software agent service:' ) . '</span>' ;
$content .= html_print_code_picker ( 'start_service_box_linux' , '' , 'installer-code-fragment' , true , true );
if ( $config [ 'language' ] === 'es' ) {
$linux_dependencies_url = 'https://pandorafms.com/manual/es/documentation/02_installation/01_installing#requisitos_para_el_agente' ;
} else {
$linux_dependencies_url = 'https://pandorafms.com/manual/en/documentation/02_installation/01_installing#agent_requirements' ;
}
$linux_dependencies_link = '<a class="green-link" href="' . $linux_dependencies_url . '" target="_blank">' . __ ( 'dependencies' ) . '</a>' ;
$content .= '<span>' . __ ( 'For the correct operation of the Linux agent it is necessary that the server has installed the following ' ) . $linux_dependencies_link . '</span>' ;
html_print_div (
[
'id' => 'linux_installer' ,
'class' => 'white_table_flex agent_details_col' ,
'style' => 'margin-bottom: 20px' ,
'content' => $content ,
]
);
// Start of Windows installer section.
$title = html_print_image (
2023-04-20 10:01:35 +02:00
'/images/windows-grey@svg.svg' ,
2023-04-19 19:21:38 +02:00
true ,
2023-04-20 10:01:35 +02:00
[ 'class' => 'installer-title-icon main_menu_icon svg-brightness-0' ]
2023-04-19 19:21:38 +02:00
);
$title .= '<span class="header_title">' . __ ( 'Windows agent' ) . '</span>' ;
$content = html_print_div (
[
'class' => 'installer-title' ,
'content' => $title ,
],
true
);
$content .= '<span>' . __ ( 'Run the following command in cmd.exe as an administrator:' ) . '</span>' ;
$content .= html_print_code_picker ( 'run_command_box_windows' , '' , 'installer-code-fragment' , false , true );
$content .= '<span>' . __ ( 'Once installed, you must run the following command to start the software agent service:' ) . '</span>' ;
$content .= html_print_code_picker ( 'start_service_box_windows' , '' , 'installer-code-fragment' , true , true );
html_print_div (
[
'id' => 'win_installer' ,
'class' => 'white_table_flex agent_details_col' ,
'style' => 'margin-bottom: 20px' ,
'content' => $content ,
]
);
// Start of MacOS installer section.
$title = html_print_image (
2023-04-20 10:01:35 +02:00
'/images/apple-grey@svg.svg' ,
2023-04-19 19:21:38 +02:00
true ,
2023-04-20 10:01:35 +02:00
[ 'class' => 'installer-title-icon main_menu_icon svg-brightness-0' ]
2023-04-19 19:21:38 +02:00
);
$title .= '<span class="header_title">' . __ ( 'Mac agent' ) . '</span>' ;
$content = html_print_div (
[
'class' => 'installer-title' ,
'content' => $title ,
],
true
);
$mac_warn_box = html_print_div (
[
'id' => 'warn_box_mac' ,
'class' => 'warn-box' ,
'content' => __ ( 'To complete the installation process, please perform a manual installation and configure the server address to XXX and specify the group as XXX. Thank you for your cooperation.' ),
],
true
);
2023-05-16 09:32:35 +02:00
$mac_installer_link = 'http://firefly.pandorafms.com/pandorafms/latest/macOS/Pandora_FMS_MacOS_agent-7.0NG.dmg' ;
$mac_content_link = '<a class="green-link" style="font-size: 15px;" href="' . $mac_installer_link . '" target="_blank">' . __ ( 'Click to Download the agent' ) . '</a>' ;
2023-04-19 19:21:38 +02:00
html_print_div (
[
'id' => 'mac_installer' ,
'class' => 'white_table_flex agent_details_col' ,
'style' => 'margin-bottom: 20px' ,
2023-05-16 09:32:35 +02:00
'content' => $content . $mac_warn_box . $mac_content_link ,
2023-04-19 19:21:38 +02:00
]
);
// Footer.
2023-04-25 09:16:48 +02:00
html_print_div ([ 'id' => 'footer_separator' ]);
2023-04-19 19:21:38 +02:00
echo '</div>' ;
html_print_div (
[
'id' => 'installer_buttonset' ,
'class' => 'flex-row' ,
'style' => '' ,
'content' => html_print_button (
__ ( 'Change configuration' ),
'change_configuration' ,
false ,
'' ,
[ 'class' => 'secondary' ],
true ,
) . html_print_button (
__ ( 'Done' ),
'done' ,
false ,
'' ,
[ 'style' => 'min-width: 0;' ],
true
2023-04-25 09:16:48 +02:00
),
2023-04-19 19:21:38 +02:00
]
);
echo '</div>' ;
return ob_get_clean ();
}
/**
* Loads JS content .
*
* @ return string JS content .
*/
public function loadJS ()
{
ob_start ();
ui_require_javascript_file ( 'stepper' , 'include/javascript/' , true );
// Javascript content.
?>
< script type = " text/javascript " >
/**
* Cleanup current dom entries .
*/
function cleanupDOM () {
$ ( '#div-identifier' ) . empty ();
$ ( '#div-product' ) . empty ();
$ ( '#div-username' ) . empty ();
$ ( '#div-password' ) . empty ();
$ ( '#div-extra_1' ) . empty ();
$ ( '#div-extra_2' ) . empty ();
}
/**
* Process ajax responses and shows a dialog with results .
*/
function showMsg ( data ) {
var title = " <?php echo __('Success'); ?> " ;
var text = '' ;
var failed = 0 ;
try {
data = JSON . parse ( data );
text = data [ 'result' ];
} catch ( err ) {
title = " <?php echo __('Failed'); ?> " ;
text = err . message ;
failed = 1 ;
}
if ( ! failed && data [ 'error' ] != undefined ) {
title = " <?php echo __('Failed'); ?> " ;
text = data [ 'error' ];
failed = 1 ;
}
if ( data [ 'report' ] != undefined ) {
data [ 'report' ] . forEach ( function ( item ){
text += '<br>' + item ;
});
}
$ ( '#msg' ) . empty ();
$ ( '#msg' ) . html ( text );
$ ( '#msg' ) . dialog ({
width : 450 ,
position : {
my : 'center' ,
at : 'center' ,
of : window ,
collision : 'fit'
},
title : title ,
buttons : [
{
class : " ui-widget ui-state-default ui-corner-all ui-button-text-only sub ok submit-next " ,
text : 'OK' ,
click : function ( e ) {
if ( ! failed ) {
$ ( " .ui-dialog-content " ) . dialog ( " close " );
$ ( '.info' ) . hide ();
cleanupDOM ();
dt_keystore . draw ( false );
} else {
$ ( this ) . dialog ( 'close' );
}
}
}
]
});
}
function generate_installer () {
$ ( '#config_page' ) . hide ();
$ ( '#installer_page' ) . show ();
var os_val = $ ( 'input[name="os"]:checked' ) . val ();
var server_addr_val = $ ( 'input[name="server_addr"]' ) . val ();
var group_val = $ ( '[name="group"] option:selected' ) . text ();
2023-04-25 09:16:48 +02:00
var win_installer_command = `Invoke-WebRequest -Uri https://firefly.pandorafms.com/pandorafms/latest/Windows/Pandora%20FMS%20Windows%20Agent%20v7.0NG.x86_64.exe -OutFile \$\{env:tmp\}\\\pandora-agent-windows.exe; & \$\{env:tmp\}\\\pandora-agent-windows.exe /S --ip ${server_addr_val} --group \"${group_val}\" --remote_config 1` ;
2023-05-22 10:45:26 +02:00
var linux_installer_command = `export PANDORA_SERVER_IP='${server_addr_val}' && \\\nexport PANDORA_REMOTE_CONFIG=1 && \\\nexport PANDORA_GROUP='${group_val}' && \\\ncurl -Ls https://pfms.me/agent-deploy | bash` ;
2023-04-19 19:21:38 +02:00
var mac_installer_text = `To complete the installation process, please perform a manual installation and configure the server IP to ${server_addr_val} and specify the group as ${group_val}. Thank you for your cooperation` ;
var linux_service_start = " /etc/init.d/pandora_agent_daemon start " ;
var win_service_start = " NET START PandoraFMSAgent " ;
switch ( os_val ) {
case '0' :
$ ( '#run_command_box_windows' ) . text ( win_installer_command );
$ ( '#start_service_box_windows' ) . text ( win_service_start );
$ ( '#linux_installer' ) . hide ();
$ ( '#mac_installer' ) . hide ();
$ ( '#win_installer' ) . show ();
break ;
case '1' :
$ ( '#run_command_box_linux' ) . text ( linux_installer_command );
$ ( '#start_service_box_linux' ) . text ( linux_service_start );
$ ( '#win_installer' ) . hide ();
$ ( '#mac_installer' ) . hide ();
$ ( '#linux_installer' ) . show ();
break ;
case '2' :
$ ( '#warn_box_mac' ) . text ( mac_installer_text );
$ ( '#win_installer' ) . hide ();
$ ( '#linux_installer' ) . hide ();
$ ( '#mac_installer' ) . show ();
break ;
}
}
function display_deploy_configuration () {
$ ( '#installer_page' ) . hide ();
$ ( '#config_page' ) . show ();
}
/**
* Loads modal from AJAX .
*/
function show_agent_install_modal () {
var title = '<?php echo __(' Deploy agent '); ?>' ;
var method = '' ;
load_modal ({
target : $ ( '#agent_deploy_modal' ),
form : 'modal_form' ,
url : '<?php echo ui_get_full_url(' ajax . php ', false, false, false); ?>' ,
ajax_callback : showMsg ,
cleanup : cleanupDOM ,
modal : {
title : title ,
},
extradata : [
{
name : 'identifier' ,
}
],
onload : function () {
display_deploy_configuration ();
var stepper_step_names = [];
stepper_step_names . push ( '<?php echo __(' Configuration '); ?>' );
stepper_step_names . push ( '<?php echo __(' Installer '); ?>' );
var stepper_container = $ ( '#stepper_container' );
var stepper = new Stepper ( stepper_container , stepper_step_names );
2023-04-20 10:01:35 +02:00
2023-04-19 19:21:38 +02:00
stepper . render ();
// Initial step: 1.
stepper . selectStep ( 1 );
$ ( " #form_generate_installer " ) . on ( 'submit' , function ( e ) {
// We only want the form to be submitted for field validation.
e . preventDefault ();
generate_installer ();
stepper . selectStep ( 2 );
});
$ ( " #button-change_configuration " ) . on ( 'click' , function () {
display_deploy_configuration ();
stepper . selectStep ( 1 );
});
$ ( " #button-done " ) . on ( 'click' , function () {
$ ( " .ui-dialog-content " ) . dialog ( " close " );
$ ( '.info' ) . hide ();
cleanupDOM ();
dt_keystore . draw ( false );
});
},
onshow : {
page : '<?php echo $this->ajaxController; ?>' ,
method : 'loadModal'
},
onsubmit : {
page : '<?php echo $this->ajaxController; ?>' ,
method : method
}
});
}
$ ( document ) . ready ( function () {
var page = 0 ;
$ ( " #button-modal_deploy_agent " ) . on ( 'click' , function () {
show_agent_install_modal ();
});
});
</ script >
< ? php
// EOF Javascript content.
return ob_get_clean ();
}
}