some functional changes in gotty

This commit is contained in:
alejandro.campos@artica.es 2023-10-02 13:57:11 +02:00
parent 85598d5012
commit 12fbd1e522
3 changed files with 207 additions and 84 deletions

View File

@ -31,6 +31,7 @@ global $config;
require_once $config['homedir'].'/include/functions_agents.php'; require_once $config['homedir'].'/include/functions_agents.php';
require_once $config['homedir'].'/godmode/wizards/Wizard.main.php'; require_once $config['homedir'].'/godmode/wizards/Wizard.main.php';
require_once $config['homedir'].'/include/functions_cron_task.php';
/** /**
@ -78,9 +79,28 @@ function quickShell()
return; return;
} }
$method = get_parameter('method', null);
$setup_anchor = html_print_anchor(
[
'href' => 'index.php?sec=gsetup&sec2=godmode/setup/setup&section=quickshell',
'content' => __('GoTTY setup'),
],
true
);
if ($method === 'ssh' && (bool) $config['gotty_ssh_enabled'] === false) {
ui_print_error_message(__('Please, enable SSH in %s', $setup_anchor));
return;
}
if ($method === 'telnet' && (bool) $config['gotty_telnet_enabled'] === false) {
ui_print_error_message(__('Please, enable Telnet in %s', $setup_anchor));
return;
}
$agent_id = get_parameter('id_agente', 0); $agent_id = get_parameter('id_agente', 0);
$username = get_parameter('username', null); $username = get_parameter('username', null);
$method = get_parameter('method', null);
$method_port = get_parameter('port', null); $method_port = get_parameter('port', null);
// Retrieve main IP Address. // Retrieve main IP Address.
@ -89,10 +109,10 @@ function quickShell()
ui_require_css_file('wizard'); ui_require_css_file('wizard');
ui_require_css_file('discovery'); ui_require_css_file('discovery');
// Initialize Gotty Client. // Build URL args.
if ($method === 'ssh') { if ($method === 'ssh') {
// SSH. // SSH.
$args = '?arg='.$username.'@'.$agent_address; $args .= '?arg='.$username.'@'.$agent_address;
//$args = '?arg='.$username.'@172.16.0.1'; //$args = '?arg='.$username.'@172.16.0.1';
$args .= '&arg=-p%20'.$method_port; $args .= '&arg=-p%20'.$method_port;
} else if ($method == 'telnet') { } else if ($method == 'telnet') {
@ -103,20 +123,15 @@ function quickShell()
$args .= '&arg='.$method_port.'&arg=-E'; $args .= '&arg='.$method_port.'&arg=-E';
} }
$method_addr = ($method === 'ssh') ? $config['gotty_ssh_addr'] : $config['gotty_telnet_addr']; $connectionURL = buildConnectionURL($method);
$address = (empty($method_addr) === true) ? $_SERVER['SERVER_ADDR'] : $method_addr; //$basic_auth_hdr = $config['gotty_ssh_user'].':'.$config['gotty_ssh_pass'].'@';
$use_ssl = ($method === 'ssh') ? $config['gotty_ssh_use_ssl'] : $config['gotty_telnet_use_ssl']; $gotty_addr = $connectionURL.$args;
$protocol = ((bool) $use_ssl === true) ? 'https://' : 'http://';
$port = ($method === 'ssh') ? $config['gotty_ssh_port'] : $config['gotty_telnet_port'];
$connection_hash = ($method === 'ssh') ? $config['gotty_ssh_connection_hash'] : $config['gotty_telnet_connection_hash'];
$gotty_addr = $protocol.$address.':'.$port.'/'.$connection_hash.'/'.$args;
// Username. Retrieve from form. // Username. Retrieve from form.
if (empty($username) === true) { if (empty($username) === true) {
// No username provided, ask for it. // No username provided, ask for it.
$wiz = new Wizard(); $wiz = new Wizard();
$wiz->printForm( $wiz->printForm(
[ [
'form' => [ 'form' => [
@ -192,13 +207,70 @@ function quickShell()
} }
</style> </style>
<div id="terminal"><iframe id="gotty-iframe" src="<?php echo $gotty_addr; ?>"></iframe></div>
<div id="terminal"><iframe id="gotty-iframe" src="<?php echo $gotty_addr; ?>"></iframe></div>
<?php
/*
<script>
// Capture error sent from iframe.
window.addEventListener("message", function(event) {
var received_data = event.data;
if (received_data.error_code) {
// Send error code to the server.
var new_url = window.location.href + "?error_code=" + received_data.error_code;
window.location.href = new_url;
}
});
var iframe = document.getElementById('gotty-iframe');
console.log(iframe );
iframe.addEventListener("error", function (event) {
console.log("erorrrrrrr");
// If an error occurs while loading the iframe content.
if (event.target.contentWindow) {
var status = event.target.contentWindow.document;
if (status && status.location) {
var status_code = status.location.href.match(/(\d{3})\.html/)[1];
if (status_code >= "400" && status_code < "600") {
// Post the error data to the parent window.
window.parent.postMessage(status_code, window.location.origin);
}
}
}
});
</script>*/
?>
<?php <?php
} }
/**
* Build Connection URL based on provided connection method.
*
* @param string $method Connection method (SSH/Telnet).
*
* @return string
*/
function buildConnectionURL($method)
{
global $config;
$method_addr = ($method === 'ssh') ? $config['gotty_ssh_addr'] : $config['gotty_telnet_addr'];
$address = (empty($method_addr) === true) ? $_SERVER['SERVER_ADDR'] : $method_addr;
$use_ssl = ($method === 'ssh') ? $config['gotty_ssh_use_ssl'] : $config['gotty_telnet_use_ssl'];
$protocol = ((bool) $use_ssl === true) ? 'https://' : 'http://';
$port = ($method === 'ssh') ? $config['gotty_ssh_port'] : $config['gotty_telnet_port'];
$connection_hash = ($method === 'ssh') ? $config['gotty_ssh_connection_hash'] : $config['gotty_telnet_connection_hash'];
//$basic_auth_hdr = $config['gotty_ssh_user'].':'.$config['gotty_ssh_pass'].'@';
return $protocol.$address.':'.$port.'/'.$connection_hash;
}
/** /**
* Provide an interface where configure all settings. * Provide an interface where configure all settings.
* *
@ -212,6 +284,15 @@ function quickShellSettings()
ui_require_css_file('discovery'); ui_require_css_file('discovery');
// Gotty settings. Internal communication (WS). // Gotty settings. Internal communication (WS).
if (isset($config['gotty_ssh_enabled']) === false) {
config_update_value('gotty_ssh_enabled', 0);
}
if (isset($config['gotty_telnet_enabled']) === false) {
config_update_value('gotty_telnet_enabled', 0);
}
if (isset($config['gotty_host']) === false) { if (isset($config['gotty_host']) === false) {
config_update_value('gotty_host', '127.0.0.1'); config_update_value('gotty_host', '127.0.0.1');
} }
@ -245,6 +326,16 @@ function quickShellSettings()
// Parser. // Parser.
if (get_parameter('update_config', false) !== false) { if (get_parameter('update_config', false) !== false) {
$gotty_ssh_enabled = get_parameter(
'gotty_ssh_enabled',
0
);
$gotty_telnet_enabled = get_parameter(
'gotty_telnet_enabled',
0
);
$gotty_ssh_addr = get_parameter( $gotty_ssh_addr = get_parameter(
'gotty_ssh_addr', 'gotty_ssh_addr',
'' ''
@ -296,6 +387,14 @@ function quickShellSettings()
'Pandor4!' 'Pandor4!'
); );
if ($config['gotty_ssh_enabled'] != $gotty_ssh_enabled) {
config_update_value('gotty_ssh_enabled', $gotty_ssh_enabled);
}
if ($config['gotty_telnet_enabled'] != $gotty_telnet_enabled) {
config_update_value('gotty_telnet_enabled', $gotty_telnet_enabled);
}
$gotty_telnet_pass = io_input_password($gotty_telnet_pass); $gotty_telnet_pass = io_input_password($gotty_telnet_pass);
if ($config['gotty_ssh_addr'] != $gotty_ssh_addr) { if ($config['gotty_ssh_addr'] != $gotty_ssh_addr) {
@ -353,6 +452,8 @@ function quickShellSettings()
$gotty_telnet_pass = io_input_password($gotty_telnet_pass); $gotty_telnet_pass = io_input_password($gotty_telnet_pass);
config_update_value('gotty_telnet_pass', $gotty_telnet_pass); config_update_value('gotty_telnet_pass', $gotty_telnet_pass);
} }
cron_task_start_gotty();
} }
echo '<fieldset class="margin-bottom-10">'; echo '<fieldset class="margin-bottom-10">';
@ -370,6 +471,16 @@ function quickShellSettings()
$ssh_table->style[0] = 'width: 50%;'; $ssh_table->style[0] = 'width: 50%;';
$ssh_table->data[0][] = html_print_label_input_block( $ssh_table->data[0][] = html_print_label_input_block(
__('Enable SSH GoTTY'),
html_print_checkbox_switch(
'gotty_ssh_enabled',
1,
$config['gotty_ssh_enabled'],
true
)
);
$ssh_table->data[1][] = html_print_label_input_block(
__('Gotty address'), __('Gotty address'),
html_print_input_text( html_print_input_text(
'gotty_ssh_addr', 'gotty_ssh_addr',
@ -381,7 +492,7 @@ function quickShellSettings()
) )
); );
$ssh_table->data[0][] = html_print_label_input_block( $ssh_table->data[1][] = html_print_label_input_block(
__('Gotty port'), __('Gotty port'),
html_print_input_text( html_print_input_text(
'gotty_ssh_port', 'gotty_ssh_port',
@ -393,7 +504,7 @@ function quickShellSettings()
) )
); );
$ssh_table->data[1][] = html_print_label_input_block( $ssh_table->data[2][] = html_print_label_input_block(
__('Gotty user'), __('Gotty user'),
html_print_input_text( html_print_input_text(
'gotty_ssh_user', 'gotty_ssh_user',
@ -405,7 +516,7 @@ function quickShellSettings()
) )
); );
$ssh_table->data[1][] = html_print_label_input_block( $ssh_table->data[2][] = html_print_label_input_block(
__('Gotty password'), __('Gotty password'),
html_print_input_password( html_print_input_password(
'gotty_ssh_pass', 'gotty_ssh_pass',
@ -417,7 +528,7 @@ function quickShellSettings()
) )
); );
$ssh_table->data[2][] = html_print_label_input_block( $ssh_table->data[3][] = html_print_label_input_block(
__('Use SSL'), __('Use SSL'),
html_print_checkbox_switch( html_print_checkbox_switch(
'gotty_ssh_use_ssl', 'gotty_ssh_use_ssl',
@ -433,7 +544,12 @@ function quickShellSettings()
$test_start = '<span id="test-gotty-spinner-ssh" class="invisible">&nbsp;'.html_print_image('images/spinner.gif', true).'</span>'; $test_start = '<span id="test-gotty-spinner-ssh" class="invisible">&nbsp;'.html_print_image('images/spinner.gif', true).'</span>';
$test_start .= '&nbsp;<span id="test-gotty-message-ssh" class="invisible"></span>'; $test_start .= '&nbsp;<span id="test-gotty-message-ssh" class="invisible"></span>';
$ssh_table->data[2][] = html_print_button( /*$tip = ui_print_help_tip(
__('Save configuration before performing test to check if GoTTY process was started successfully'),
true
);*/
$ssh_table->data[3][] = html_print_button(
__('Test'), __('Test'),
'test-gotty-ssh', 'test-gotty-ssh',
false, false,
@ -462,6 +578,16 @@ function quickShellSettings()
$telnet_table->style[0] = 'width: 50%;'; $telnet_table->style[0] = 'width: 50%;';
$telnet_table->data[0][] = html_print_label_input_block( $telnet_table->data[0][] = html_print_label_input_block(
__('Enable Telnet GoTTY'),
html_print_checkbox_switch(
'gotty_telnet_enabled',
1,
$config['gotty_telnet_enabled'],
true
)
);
$telnet_table->data[1][] = html_print_label_input_block(
__('Gotty address'), __('Gotty address'),
html_print_input_text( html_print_input_text(
'gotty_telnet_addr', 'gotty_telnet_addr',
@ -473,7 +599,7 @@ function quickShellSettings()
) )
); );
$telnet_table->data[0][] = html_print_label_input_block( $telnet_table->data[1][] = html_print_label_input_block(
__('Gotty port'), __('Gotty port'),
html_print_input_text( html_print_input_text(
'gotty_telnet_port', 'gotty_telnet_port',
@ -485,7 +611,7 @@ function quickShellSettings()
) )
); );
$telnet_table->data[1][] = html_print_label_input_block( $telnet_table->data[2][] = html_print_label_input_block(
__('Gotty user'), __('Gotty user'),
html_print_input_text( html_print_input_text(
'gotty_telnet_user', 'gotty_telnet_user',
@ -497,7 +623,7 @@ function quickShellSettings()
) )
); );
$telnet_table->data[1][] = html_print_label_input_block( $telnet_table->data[2][] = html_print_label_input_block(
__('Gotty password'), __('Gotty password'),
html_print_input_password( html_print_input_password(
'gotty_telnet_pass', 'gotty_telnet_pass',
@ -509,7 +635,7 @@ function quickShellSettings()
) )
); );
$telnet_table->data[2][] = html_print_label_input_block( $telnet_table->data[3][] = html_print_label_input_block(
__('Use SSL'), __('Use SSL'),
html_print_checkbox_switch( html_print_checkbox_switch(
'gotty_telnet_use_ssl', 'gotty_telnet_use_ssl',
@ -524,7 +650,7 @@ function quickShellSettings()
$test_start = '<span id="test-gotty-spinner-telnet" class="invisible">&nbsp;'.html_print_image('images/spinner.gif', true).'</span>'; $test_start = '<span id="test-gotty-spinner-telnet" class="invisible">&nbsp;'.html_print_image('images/spinner.gif', true).'</span>';
$test_start .= '&nbsp;<span id="test-gotty-message-telnet" class="invisible"></span>'; $test_start .= '&nbsp;<span id="test-gotty-message-telnet" class="invisible"></span>';
$telnet_table->data[2][] = html_print_button( $telnet_table->data[3][] = html_print_button(
__('Test'), __('Test'),
'test-gotty-telnet', 'test-gotty-telnet',
false, false,
@ -545,9 +671,10 @@ function quickShellSettings()
if (is_ajax() === true) { if (is_ajax() === true) {
$address = get_parameter('address'); $method = (string) get_parameter('method', '');
if (isset($address) === true) { if (empty($method) === false) {
$address = buildConnectionURL($method);
$ch = curl_init($address); $ch = curl_init($address);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@ -571,6 +698,9 @@ if (is_ajax() === true) {
echo json_encode($result); echo json_encode($result);
return; return;
} }
$result = ['status' => 'error'];
return;
} }
// This extension is useful only if the agent has associated IP. // This extension is useful only if the agent has associated IP.
@ -599,13 +729,14 @@ if (empty($agent_id) === false
} }
echo '<script>'; echo '<script>';
echo 'var server_addr = "'.$_SERVER['SERVER_ADDR'].'";'; echo 'var server_addr = "'.$_SERVER['SERVER_ADDR'].'";';
echo "function checkAddressReachability(address, callback) { echo "function checkAddressReachability(method, callback) {
$.ajax({ $.ajax({
url: 'ajax.php', url: 'ajax.php',
data: { data: {
page: 'extensions/quick_shell', page: 'extensions/quick_shell',
address method
}, },
type: 'GET', type: 'GET',
async: false, async: false,
@ -663,7 +794,7 @@ $handle_test_telnet = "var handleTestTelnet = function (event) {
hideMessage(); hideMessage();
showLoadingImage(); showLoadingImage();
checkAddressReachability(url, function(isReachable) { checkAddressReachability('telnet', function(isReachable) {
if (isReachable) { if (isReachable) {
showSuccessImage(); showSuccessImage();
hideMessage(); hideMessage();
@ -717,7 +848,7 @@ $handle_test_ssh = "var handleTestSSH = function (event) {
hideMessage(); hideMessage();
showLoadingImage(); showLoadingImage();
checkAddressReachability(url, function(isReachable) { checkAddressReachability('ssh', function(isReachable) {
if (isReachable) { if (isReachable) {
showSuccessImage(); showSuccessImage();
hideMessage(); hideMessage();

View File

@ -161,30 +161,37 @@ class DiscoveryConsoleTask
} }
} }
// Maintenance task: schedule task 'cron_task_start_gotty' if not defined yet. // Maintenance task: schedule daily task to manage GoTTY processes if not defined yet.
// Must do at every Cron execution. // Must do at every Cron execution.
if ((bool) $config['enterprise_installed'] === false) { $gotty_ssh_enabled = (bool) $config['gotty_ssh_enabled'];
$call_func_user_task_id = db_get_value_sql('SELECT id FROM `tuser_task` WHERE `function_name` = "cron_task_call_user_function"'); $gotty_telnet_enabled = (bool) $config['gotty_telnet_enabled'];
if ($call_func_user_task_id === false) {
db_process_sql("INSERT INTO `tuser_task` (`function_name`, `parameters`, `name`) VALUES ('cron_task_call_user_function','a:1:{i:0;a:2:{s:11:\"description\";s:13:\"Function name\";s:4:\"type\";s:4:\"text\";}}','Call PHP function')"); if ($gotty_ssh_enabled === true || $gotty_telnet_enabled === true) {
// Create necessary data in task tables when some method of GoTTY is enabled in setup.
if ((bool) $config['enterprise_installed'] === false) {
$call_func_user_task_id = db_get_value_sql('SELECT id FROM `tuser_task` WHERE `function_name` = "cron_task_call_user_function"');
if ($call_func_user_task_id === false) {
db_process_sql("INSERT INTO `tuser_task` (`function_name`, `parameters`, `name`) VALUES ('cron_task_call_user_function','a:1:{i:0;a:2:{s:11:\"description\";s:13:\"Function name\";s:4:\"type\";s:4:\"text\";}}','Call PHP function')");
}
} }
}
$user_function_task_id = db_get_value_sql('SELECT id FROM `tuser_task_scheduled` WHERE `args` LIKE "%cron_task_start_gotty%"'); $user_function_task_id = db_get_value_sql('SELECT id FROM `tuser_task_scheduled` WHERE `args` LIKE "%cron_task_start_gotty%"');
if ($user_function_task_id === false) { if ($user_function_task_id === false) {
$this->schedule( // Schedule task to manage GoTTY processes daily if it is not scheduled yet.
'cron_task_call_user_function', $this->schedule(
[ 'cron_task_call_user_function',
0 => 'cron_task_start_gotty', [
'function_name' => 'cron_task_start_gotty', 0 => 'cron_task_start_gotty',
'internal' => 1, 'function_name' => 'cron_task_start_gotty',
], 'internal' => 1,
'daily', ],
0, 'daily',
0, 0,
strtotime('tomorrow') 0,
); strtotime('tomorrow')
);
}
} }
// Maintenance task: check whether start GoTTY SSH and Telnet processes are running and start otherwise. // Maintenance task: check whether start GoTTY SSH and Telnet processes are running and start otherwise.

View File

@ -449,15 +449,12 @@ function cron_task_start_gotty(bool $restart_mode=true)
{ {
global $config; global $config;
if (empty($config['gotty_ssh_addr']) === true
&& empty($config['gotty_telnet_addr']) === true
) {
return;
}
include_once $config['homedir'].'/include/functions_config.php'; include_once $config['homedir'].'/include/functions_config.php';
// Check prev SSH process running and kill it. $gotty_ssh_enabled = (bool) $config['gotty_ssh_enabled'];
$gotty_telnet_enabled = (bool) $config['gotty_telnet_enabled'];
// Check prev SSH process running and kill it (before changing config parameters).
if (empty($config['restart_gotty_ssh_next_cron_port']) === false) { if (empty($config['restart_gotty_ssh_next_cron_port']) === false) {
config_update_value('restart_gotty_ssh_next_cron_port', ''); config_update_value('restart_gotty_ssh_next_cron_port', '');
@ -468,7 +465,7 @@ function cron_task_start_gotty(bool $restart_mode=true)
} }
} }
// Check if prev Telnet process running and kill it. // Check if prev Telnet process running and kill it (before changing config parameters).
if (empty($config['restart_gotty_telnet_next_cron_port']) === false) { if (empty($config['restart_gotty_telnet_next_cron_port']) === false) {
config_update_value('restart_gotty_telnet_next_cron_port', ''); config_update_value('restart_gotty_telnet_next_cron_port', '');
@ -486,49 +483,38 @@ function cron_task_start_gotty(bool $restart_mode=true)
$start_ssh_proc = true; $start_ssh_proc = true;
$start_telnet_proc = true; $start_telnet_proc = true;
if (empty($config['gotty_ssh_addr']) === true) { if ($gotty_ssh_enabled === false) {
$start_ssh_proc = false; $start_ssh_proc = false;
} }
if (empty($config['gotty_telnet_addr']) === true) { if ($gotty_telnet_enabled === false) {
$start_telnet_proc = false; $start_telnet_proc = false;
} }
if (!empty($processRunningSSH)) { if (!empty($processRunningSSH)) {
// Process is running. // Process is running.
if ($restart_mode === true || $start_ssh_proc === false) { if ($restart_mode === true || $start_ssh_proc === false) {
// Stop the process for restarting. // Stop the process for restarting or in case GoTTY method is disabled in this iteration.
shell_exec("pkill -f 'pandora_gotty.*-p ".$config['gotty_ssh_port']."'"); shell_exec("pkill -f 'pandora_gotty.*-p ".$config['gotty_ssh_port']."'");
} else { } else {
// Prevent starting if already running and must not be restarted. // Prevent starting if already running and must not be restarted or terminated.
$start_ssh_proc = false; $start_ssh_proc = false;
} }
} }
if (!empty($processRunningTelnet)) { if (!empty($processRunningTelnet)) {
// Process is running. // Process is running.
if ($restart_mode === true if ($restart_mode === true || $start_telnet_proc === false) {
|| empty($config['restart_gotty_telnet_next_cron_port']) === false // Stop the process for restarting or in case GoTTY method is disabled in this iteration.
|| $start_telnet_proc === false shell_exec("pkill -f 'pandora_gotty.*-p ".$config['gotty_telnet_port']."'");
) {
// Restart GoTTY if it is intended to be restarted specifically, port has changed, or address was changed to an empty value.
if (empty($config['restart_gotty_telnet_next_cron_port']) === false) {
$telnet_port_kill = $config['restart_gotty_telnet_next_cron_port'];
config_update_value('restart_gotty_telnet_next_cron_port', '');
} else {
$telnet_port_kill = $config['gotty_telnet_port'];
}
// Stop the process for restarting.
shell_exec("pkill -f 'pandora_gotty.*-p ".$telnet_port_kill."'");
} else { } else {
// Prevent starting if already running and must not be restarted. // Prevent starting if already running and must not be restarted or terminated.
$start_telnet_proc = false; $start_telnet_proc = false;
} }
} }
if ($start_ssh_proc === false && $start_telnet_proc === false) { if ($start_ssh_proc === false && $start_telnet_proc === false) {
// Nothing to do. // Nothing to start.
return; return;
} }
@ -537,7 +523,7 @@ function cron_task_start_gotty(bool $restart_mode=true)
shell_exec('touch '.$logFilePathSSH); shell_exec('touch '.$logFilePathSSH);
// Start pandora_gotty and capture the output. // Start pandora_gotty and capture the output.
$command_ssh = '/usr/bin/nohup /usr/bin/pandora_gotty --config /etc/pandora_gotty/pandora_gotty.conf -p '.$config['gotty_ssh_port'].' ssh > '.$logFilePathSSH.' 2>&1 &'; $command_ssh = '/usr/bin/nohup /usr/bin/pandora_gotty --config /etc/pandora_gotty/pandora_gotty.conf --ws-origin ".*" -p '.$config['gotty_ssh_port'].' ssh > '.$logFilePathSSH.' 2>&1 &';
shell_exec($command_ssh); shell_exec($command_ssh);
} }
@ -546,15 +532,15 @@ function cron_task_start_gotty(bool $restart_mode=true)
shell_exec('touch '.$logFilePathTelnet); shell_exec('touch '.$logFilePathTelnet);
// Start pandora_gotty and capture the output. // Start pandora_gotty and capture the output.
$command_telnet = '/usr/bin/nohup /usr/bin/pandora_gotty --config /etc/pandora_gotty/pandora_gotty.conf -p '.$config['gotty_telnet_port'].' telnet > '.$logFilePathTelnet.' 2>&1 &'; $command_telnet = '/usr/bin/nohup /usr/bin/pandora_gotty --config /etc/pandora_gotty/pandora_gotty.conf --ws-origin ".*" -p '.$config['gotty_telnet_port'].' telnet > '.$logFilePathTelnet.' 2>&1 &';
shell_exec($command_telnet); shell_exec($command_telnet);
} }
$ssh_hash_read = false; $ssh_hash_read = false;
$telnet_hash_read = false; $telnet_hash_read = false;
// Maximum wait time (seconds). // Maximum wait time to read asynchronously the output of the executed commands (seconds).
$maxWaitTime = 2; $maxWaitTime = 10;
// Wait for content to appear in the log file. // Wait for content to appear in the log file.
$startTime = time(); $startTime = time();
@ -579,11 +565,10 @@ function cron_task_start_gotty(bool $restart_mode=true)
$hash = array_slice($parts, -2, 1)[0]; $hash = array_slice($parts, -2, 1)[0];
config_update_value('gotty_ssh_connection_hash', $hash); config_update_value('gotty_ssh_connection_hash', $hash);
$ssh_hash_read = true;
} }
unlink($logFilePathSSH); unlink($logFilePathSSH);
$ssh_hash_read = true;
} }
if ($start_telnet_proc === true) { if ($start_telnet_proc === true) {
@ -604,16 +589,16 @@ function cron_task_start_gotty(bool $restart_mode=true)
$hash = array_slice($parts, -2, 1)[0]; $hash = array_slice($parts, -2, 1)[0];
config_update_value('gotty_telnet_connection_hash', $hash); config_update_value('gotty_telnet_connection_hash', $hash);
$telnet_hash_read = true;
} }
unlink($logFilePathTelnet); unlink($logFilePathTelnet);
$telnet_hash_read = true;
} }
if (($start_ssh_proc === false || $ssh_hash_read === true) if (($start_ssh_proc === false || $ssh_hash_read === true)
&& ($start_telnet_proc === false || $telnet_hash_read === true) && ($start_telnet_proc === false || $telnet_hash_read === true)
) { ) {
// As soon as the reads have completed, the timing loop will terminate.
break; break;
} }