El tablero StateSkill está diseñado para monitorear el estado de las colas de Asterisk, brindando mayor control sobre agentes y llamadas.
El código se estructura en múltiples métodos privados para mejorar la organización y flexibilidad. La actualización de los datos ocurre cada 8 segundos dinámicamente.
- El usuario selecciona una skill desde un selector.
- El índice de la skill se extrae de un array dentro del controlador.
- Este índice se almacena en la variable
$selectedCampaigny en una sesión. - Se genera dinámicamente un comando que se ejecutará en el servidor:
rasterisk -rx 'queue show q{$campaignIndex}' | sort
Para ejecutar el comando en el servidor, se utiliza la librería phpseclib, permitiendo una conexión momentánea para obtener los datos.
Los datos devueltos suelen ser extensos y técnicos, por lo que se realiza una limpieza y procesamiento para mejorar la comprensión de la información mostrada en el tablero.
Además del monitoreo por skill, el tablero muestra un resumen general de todas las colas, proporcionando una visión completa del estado del sistema.
Este método gestiona la ejecución de comandos en el servidor para obtener información sobre las colas.
public function executeCommand(Request $request) {
$timing = [];
$campaignIndex = $request->input('campaign');
session(['selectedCampaign' => $campaignIndex]);
$command = "rasterisk -rx 'queue show q{$campaignIndex}' | sort";
$output = $this->getSSHOutput($command);
$cleanOutput = $this->removeAnsiCharacters($output);
return view('campaigns', [
'calls' => $this->extractCallsInQueue($cleanOutput),
'members' => $this->extractQueueMembersSummary($cleanOutput),
'agents' => $this->getAgentDetails($cleanOutput),
]);
}
Estos métodos validan los parámetros recibidos en la solicitud:
return $request->validate([
'campaign' => 'required|integer|min:1|max:' . count(self::CAMPAIGN_OPTIONS),
]);
Establece conexión con el servidor usando phpseclib:
$user = env('USER_SERVER');
$password = env('PASSWORD_SERVER');
$host_server = env('HOST_SERVER');
$ssh = new SSH2($host_server);
if (!$ssh->login($user, $password)) {
return null;
}
return $ssh->exec($command);
Elimina caracteres ANSI de la salida:
$ansiEscape = '/\x1B\[.*?m/';
return preg_replace($ansiEscape, '', $output);
Extrae las llamadas en espera, incluyendo SIP e IAX2:
$queueCallsPattern = '/\d+.\s+(?:SIP|IAX2)\/\S+\s+\(.*?\)/m';
preg_match_all($queueCallsPattern, $cleanOutput, $matches);
Obtiene el resumen de miembros en la cola:
$membersPattern = '/^Q\d+\s+.*?strategy.*?$/m';
preg_match_all($membersPattern, $output, $matches);
Extrae el estado de todas las colas:
$pattern = '/Q(\d+).*?has\s+(\d+)\s+calls/';
preg_match_all($pattern, $output, $matches, PREG_SET_ORDER);