mirror of https://github.com/portainer/portainer
86 lines
2.7 KiB
JavaScript
86 lines
2.7 KiB
JavaScript
import axios from '@/portainer/services/axios';
|
|
|
|
/* @ngInject */
|
|
export default function LogsController($scope, $async, $state, Notifications) {
|
|
let controller = new AbortController();
|
|
|
|
$scope.stderrLog = [];
|
|
$scope.stdoutLog = [];
|
|
|
|
$scope.changeLogCollection = function (logCollectionStatus) {
|
|
if (!logCollectionStatus) {
|
|
controller.abort();
|
|
controller = new AbortController();
|
|
} else {
|
|
loadLogs('stderr', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller);
|
|
loadLogs('stdout', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller);
|
|
}
|
|
};
|
|
|
|
function stripEscapeCodes(logs) {
|
|
return logs.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');
|
|
}
|
|
|
|
function formatLogs(logs, splitter = '\\n') {
|
|
if (!logs) {
|
|
return [];
|
|
}
|
|
|
|
const formattedLogs = [];
|
|
const logInLines = logs.trim().split(splitter);
|
|
|
|
for (const logInLine of logInLines) {
|
|
const line = stripEscapeCodes(logInLine).replace('\n', '').replace(/[""]+/g, '');
|
|
formattedLogs.push({ line, spans: [{ foregroundColor: null, backgroundColor: null, text: line }] });
|
|
}
|
|
|
|
return formattedLogs;
|
|
}
|
|
async function loadLogs(logType, jobID, taskName, namespace, endpointId, controller, refresh = true, offset = 50000) {
|
|
axios
|
|
.get(`/nomad/endpoints/${endpointId}/allocation/${$scope.allocationID}/logs`, {
|
|
params: {
|
|
jobID,
|
|
taskName,
|
|
namespace,
|
|
refresh,
|
|
logType,
|
|
offset,
|
|
},
|
|
signal: controller.signal,
|
|
onDownloadProgress: (progressEvent) => {
|
|
$scope[`${logType}Log`] = formatLogs(progressEvent.currentTarget.response);
|
|
$scope.$apply();
|
|
},
|
|
})
|
|
.then((response) => {
|
|
$scope[`${logType}Log`] = formatLogs(response.data, '\n');
|
|
$scope.$apply();
|
|
})
|
|
.catch((err) => {
|
|
if (err.message !== 'canceled') Notifications.error('Failure', err, 'Unable to retrieve task logs');
|
|
});
|
|
}
|
|
|
|
async function initView() {
|
|
return $async(async () => {
|
|
$scope.jobID = $state.params.jobID;
|
|
$scope.taskName = $state.params.taskName;
|
|
$scope.allocationID = $state.params.allocationID;
|
|
$scope.namespace = $state.params.namespace;
|
|
$scope.endpointId = $state.params.endpointId;
|
|
|
|
loadLogs('stderr', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller);
|
|
loadLogs('stdout', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller);
|
|
});
|
|
}
|
|
|
|
$scope.$on('$destroy', function () {
|
|
if (controller) {
|
|
controller.abort();
|
|
}
|
|
});
|
|
|
|
initView();
|
|
}
|