diff --git a/dockerManager/static/dockerManager/dockerManager.js b/dockerManager/static/dockerManager/dockerManager.js new file mode 100644 index 000000000..e77e55ed6 --- /dev/null +++ b/dockerManager/static/dockerManager/dockerManager.js @@ -0,0 +1,1180 @@ +app.controller('installDocker', function ($scope, $http, $timeout, $window) { + $scope.installDockerStatus = true; + $scope.installBoxGen = true; + $scope.dockerInstallBTN = false; + + $scope.installDocker = function () { + + $scope.installDockerStatus = false; + $scope.installBoxGen = true; + $scope.dockerInstallBTN = true; + + url = "/docker/installDocker"; + + var data = {}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + $scope.installBoxGen = false; + getRequestStatus(); + } + else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + + function getRequestStatus() { + $scope.cyberPanelLoading = false; + + url = "/serverstatus/switchTOLSWSStatus"; + + var data = {}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + if (response.data.abort === 0) { + $scope.requestData = response.data.requestStatus; + $timeout(getRequestStatus, 1000); + } + else { + // Notifications + $scope.cyberPanelLoading = true; + $timeout.cancel(); + $scope.requestData = response.data.requestStatus; + if (response.data.installed === 1) { + $timeout(function () { + $window.location.reload(); + }, 3000); + } + + } + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + + + } + + } +}); + +/* Java script code for docker management */ +var delayTimer = null; + +app.controller('dockerImages', function ($scope) { + $scope.tagList = []; + $scope.imageTag = {}; +}); + +/* Java script code to install Container */ + +app.controller('runContainer', function ($scope, $http) { + $scope.containerCreationLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + $scope.volList = {}; + $scope.volListNumber = 0; + $scope.addVolField = function () { + $scope.volList[$scope.volListNumber] = {'dest': '', 'src': ''}; + $scope.volListNumber = $scope.volListNumber + 1; + console.log($scope.volList) + }; + $scope.removeVolField = function () { + delete $scope.volList[$scope.volListNumber - 1]; + $scope.volListNumber = $scope.volListNumber - 1; + }; + + $scope.addEnvField = function () { + var countEnv = Object.keys($scope.envList).length; + $scope.envList[countEnv + 1] = {'name': '', 'value': ''}; + }; + + var statusFile; + + $scope.createContainer = function () { + + $scope.containerCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + $scope.currentStatus = "Starting creation.."; + + url = "/docker/submitContainerCreation"; + + var name = $scope.name; + var tag = $scope.tag; + var memory = $scope.memory; + var dockerOwner = $scope.dockerOwner; + var image = $scope.image; + var numberOfEnv = Object.keys($scope.envList).length; + + var data = { + name: name, + tag: tag, + memory: memory, + dockerOwner: dockerOwner, + image: image, + envList: $scope.envList, + volList: $scope.volList + + }; + + $.each($scope.portType, function (port, protocol) { + data[port + "/" + protocol] = $scope.eport[port]; + }); + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.createContainerStatus === 1) { + $scope.currentStatus = "Successful. Redirecting..."; + window.location.href = "/docker/view/" + $scope.name + } + else { + + $scope.containerCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.containerCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + }; + $scope.goBack = function () { + $scope.containerCreationLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + +}); + +/* Javascript code for listing containers */ + + +app.controller('listContainers', function ($scope, $http) { + $scope.activeLog = ""; + $scope.assignActive = ""; + + $scope.assignContainer = function (name) { + $("#assign").modal("show"); + $scope.assignActive = name; + }; + + $scope.submitAssignContainer = function () { + url = "/docker/assignContainer"; + + var data = {name: $scope.assignActive, admin: $scope.dockerOwner}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + function ListInitialData(response) { + + if (response.data.assignContainerStatus === 1) { + new PNotify({ + title: 'Container assigned successfully', + type: 'success' + }); + window.location.href = '/docker/listContainers'; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + } + $("#assign").modal("hide"); + } + + function cantLoadInitialData(response) { + console.log("not good"); + new PNotify({ + title: 'Unable to complete request', + type: 'error' + }); + $("#assign").modal("hide"); + } + }; + + $scope.delContainer = function (name, unlisted=false) { + (new PNotify({ + title: 'Confirmation Needed', + text: 'Are you sure?', + icon: 'fa fa-question-circle', + hide: false, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + } + })).get().on('pnotify.confirm', function () { + $('#imageLoading').show(); + url = "/docker/delContainer"; + + var data = {name: name, unlisted: unlisted}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + console.log(response); + + if (response.data.delContainerStatus === 1) { + location.reload(); + } + else if (response.data.delContainerStatus === 2) { + (new PNotify({ + title: response.data.error_message, + text: 'Delete anyway?', + icon: 'fa fa-question-circle', + hide: false, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + } + })).get().on('pnotify.confirm', function () { + url = "/docker/delContainer"; + + var data = {name: name, unlisted: unlisted, force: 1}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + if (response.data.delContainerStatus === 1) { + location.reload(); + } + else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + } + $('#imageLoading').hide(); + } + + function cantLoadInitialData(response) { + $('#imageLoading').hide(); + } + }) + } + else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + } + $('#imageLoading').hide(); + } + + function cantLoadInitialData(response) { + $('#imageLoading').hide(); + } + }) + } + + $scope.showLog = function (name, refresh = false) { + $scope.logs = ""; + if (refresh === false) { + $('#logs').modal('show'); + $scope.activeLog = name; + } + else { + name = $scope.activeLog; + } + $scope.logs = "Loading..."; + + url = "/docker/getContainerLogs"; + + var data = {name: name}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + console.log(response); + + if (response.data.containerLogStatus === 1) { + $scope.logs = response.data.containerLog; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + new PNotify({ + title: 'Unable to complete request', + type: 'error' + }); + } + }; + + url = "/docker/getContainerList"; + + var data = {page: 1}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + console.log(response); + + if (response.data.listContainerStatus === 1) { + + var finalData = JSON.parse(response.data.data); + $scope.ContainerList = finalData; + console.log($scope.ContainerList); + $("#listFail").hide(); + } + else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + + } + } + + function cantLoadInitialData(response) { + console.log("not good"); + } + + + $scope.getFurtherContainersFromDB = function (pageNumber) { + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = {page: pageNumber}; + + + dataurl = "/docker/getContainerList"; + + $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + if (response.data.listContainerStatus === 1) { + + var finalData = JSON.parse(response.data.data); + $scope.ContainerList = finalData; + $("#listFail").hide(); + } + else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + console.log(response.data); + + } + } + + function cantLoadInitialData(response) { + console.log("not good"); + } + + + }; +}); + +/* Java script code for containerr home page */ + +app.controller('viewContainer', function ($scope, $http) { + $scope.cName = ""; + $scope.status = ""; + $scope.savingSettings = false; + $scope.loadingTop = false; + + $scope.recreate = function () { + (new PNotify({ + title: 'Confirmation Needed', + text: 'Are you sure?', + icon: 'fa fa-question-circle', + hide: false, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + } + })).get().on('pnotify.confirm', function () { + $('#infoLoading').show(); + + url = "/docker/recreateContainer"; + var data = {name: $scope.cName}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + function ListInitialData(response) { + if (response.data.recreateContainerStatus === 1) { + new PNotify({ + title: 'Action completed!', + text: 'Redirecting...', + type: 'success' + }); + location.reload(); + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + + } + $('#infoLoading').hide(); + } + + function cantLoadInitialData(response) { + PNotify.error({ + title: 'Unable to complete request', + text: "Problem in connecting to server" + }); + $('#actionLoading').hide(); + } + }) + } + + $scope.addEnvField = function () { + var countEnv = Object.keys($scope.envList).length; + $scope.envList[countEnv + 1] = {'name': '', 'value': ''}; + } + + $scope.showTop = function () { + $scope.topHead = []; + $scope.topProcesses = []; + $scope.loadingTop = true; + $("#processes").modal("show"); + + url = "/docker/getContainerTop"; + var data = {name: $scope.cName}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + function ListInitialData(response) { + if (response.data.containerTopStatus === 1) { + $scope.topHead = response.data.processes.Titles; + $scope.topProcesses = response.data.processes.Processes; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + + } + $scope.loadingTop = false; + } + + function cantLoadInitialData(response) { + PNotify.error({ + title: 'Unable to complete request', + text: "Problem in connecting to server" + }); + $scope.loadingTop = false; + } + + } + + $scope.cRemove = function () { + (new PNotify({ + title: 'Confirmation Needed', + text: 'Are you sure?', + icon: 'fa fa-question-circle', + hide: false, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + } + })).get().on('pnotify.confirm', function () { + $('#actionLoading').show(); + + url = "/docker/delContainer"; + var data = {name: $scope.cName, unlisted: false}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + function ListInitialData(response) { + if (response.data.delContainerStatus === 1) { + new PNotify({ + title: 'Container deleted!', + text: 'Redirecting...', + type: 'success' + }); + window.location.href = '/docker/listContainers'; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + } + $('#actionLoading').hide(); + } + + function cantLoadInitialData(response) { + PNotify.error({ + title: 'Unable to complete request', + text: "Problem in connecting to server" + }); + $('#actionLoading').hide(); + } + }) + } + + $scope.refreshStatus = function () { + url = "/docker/getContainerStatus"; + var data = {name: $scope.cName}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + function ListInitialData(response) { + if (response.data.containerStatus === 1) { + console.log(response.data.status); + $scope.status = response.data.status; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + PNotify.error({ + title: 'Unable to complete request', + text: "Problem in connecting to server" + }); + } + + }; + + $scope.addVolField = function () { + $scope.volList[$scope.volListNumber] = {'dest': '', 'src': ''}; + $scope.volListNumber = $scope.volListNumber + 1; + }; + $scope.removeVolField = function () { + delete $scope.volList[$scope.volListNumber - 1]; + $scope.volListNumber = $scope.volListNumber - 1; + }; + + $scope.saveSettings = function () { + $('#containerSettingLoading').show(); + url = "/docker/saveContainerSettings"; + $scope.savingSettings = true; + + var data = { + name: $scope.cName, + memory: $scope.memory, + startOnReboot: $scope.startOnReboot, + envConfirmation: $scope.envConfirmation, + envList: $scope.envList, + volList: $scope.volList + }; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + function ListInitialData(response) { + if (response.data.saveSettingsStatus === 1) { + if ($scope.envConfirmation) { + new PNotify({ + title: 'Done. Redirecting...', + type: 'success' + }); + location.reload(); + } + else { + new PNotify({ + title: 'Settings Saved', + type: 'success' + }); + } + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + + } + $('#containerSettingLoading').hide(); + $scope.savingSettings = false; + } + + function cantLoadInitialData(response) { + new PNotify({ + title: 'Unable to complete request', + text: "Problem in connecting to server", + type: 'error' + }); + $('#containerSettingLoading').hide(); + $scope.savingSettings = false; + } + + if ($scope.startOnReboot === true) { + $scope.rPolicy = "Yes"; + } + else { + $scope.rPolicy = "No"; + } + + } + + $scope.cAction = function (action) { + $('#actionLoading').show(); + console.log($scope.cName) + url = "/docker/doContainerAction"; + var data = {name: $scope.cName, action: action}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + console.log(response); + + if (response.data.containerActionStatus === 1) { + new PNotify({ + title: 'Success!', + text: 'Action completed', + type: 'success' + }); + $scope.status = response.data.status; + $scope.refreshStatus() + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + + } + $('#actionLoading').hide(); + } + + function cantLoadInitialData(response) { + PNotify.error({ + title: 'Unable to complete request', + text: "Problem in connecting to server" + }); + $('#actionLoading').hide(); + } + + } + + $scope.loadLogs = function (name) { + $scope.logs = "Loading..."; + + url = "/docker/getContainerLogs"; + + var data = {name: name}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + console.log(response); + + if (response.data.containerLogStatus === 1) { + $scope.logs = response.data.containerLog; + } + else { + $scope.logs = response.data.error_message; + + } + } + + function cantLoadInitialData(response) { + console.log("not good"); + $scope.logs = "Error loading log"; + } + } + +}); + + +/* Java script code for docker image management */ +app.controller('manageImages', function ($scope, $http) { + $scope.tagList = []; + $scope.showingSearch = false; + $("#searchResult").hide(); + + $scope.pullImage = function (image, tag) { + function ListInitialDatas(response) { + if (response.data.installImageStatus === 1) { + new PNotify({ + title: 'Image pulled successfully', + text: 'Reloading...', + type: 'success' + }); + location.reload() + } + else { + new PNotify({ + title: 'Failed to complete request', + text: response.data.error_message, + type: 'error' + }); + } + + $('#imageLoading').hide(); + + } + + function cantLoadInitialDatas(response) { + $('#imageLoading').hide(); + new PNotify({ + title: 'Failed to complete request', + type: 'error' + }); + } + + if (image && tag) { + $('#imageLoading').show(); + + url = "/docker/installImage"; + var data = { + image: image, + tag: tag + }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + } + else { + new PNotify({ + title: 'Unable to complete request', + text: 'Please select a tag', + type: 'info' + }); + } + + } + + $scope.searchImages = function () { + console.log($scope.searchString); + if (!$scope.searchString) { + $("#searchResult").hide(); + } + else { + $("#searchResult").show(); + } + clearTimeout(delayTimer); + delayTimer = setTimeout(function () { + $('#imageLoading').show(); + + url = "/docker/searchImage"; + var data = { + string: $scope.searchString + }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + if (response.data.searchImageStatus === 1) { + $scope.images = response.data.matches; + console.log($scope.images) + } + else { + new PNotify({ + title: 'Failed to complete request', + text: response.data.error, + type: 'error' + }); + } + + $('#imageLoading').hide(); + + } + + function cantLoadInitialDatas(response) { + $('#imageLoading').hide(); + new PNotify({ + title: 'Failed to complete request', + type: 'error' + }); + } + }, 500); + } + + function populateTagList(image, page) { + $('imageLoading').show(); + url = "/docker/getTags" + var data = { + image: image, + page: page + 1 + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + + if (response.data.getTagsStatus === 1) { + $scope.tagList[image].splice(-1, 1); + $scope.tagList[image] = $scope.tagList[image].concat(response.data.list); + + if (response.data.next != null) { + $scope.tagList[image].push("Load more"); + } + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + } + $('#imageLoading').hide(); + } + + function cantLoadInitialData(response) { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + $('#imageLoading').hide(); + } + } + + $scope.runContainer = function (image) { + $("#errorMessage").hide(); + if ($scope.imageTag[image] !== undefined) { + $("#imageList").css("pointer-events", "none"); + } + else { + $("#errorMessage").show(); + $scope.errorMessage = "Please select a tag"; + } + } + + $scope.loadTags = function (event) { + var pagesloaded = $(event.target).data('pageloaded'); + var image = event.target.id; + + if (!pagesloaded) { + $scope.tagList[image] = ['Loading...']; + $(event.target).data('pageloaded', 1); + + populateTagList(image, pagesloaded); +// $("#"+image+" option:selected").prop("selected", false); + } + } + + $scope.selectTag = function () { + var image = event.target.id; + var selectedTag = $('#' + image).find(":selected").text(); + + if (selectedTag == 'Load more') { + var pagesloaded = $(event.target).data('pageloaded'); + $(event.target).data('pageloaded', pagesloaded + 1); + + populateTagList(image, pagesloaded); + } + } + + $scope.getHistory = function (counter) { + $('#imageLoading').show(); + var name = $("#" + counter).val() + + url = "/docker/getImageHistory"; + + var data = {name: name}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + console.log(response); + + if (response.data.imageHistoryStatus === 1) { + $('#history').modal('show'); + $scope.historyList = response.data.history; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + } + $('#imageLoading').hide(); + } + + function cantLoadInitialData(response) { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + $('#imageLoading').hide(); + } + } + + $scope.rmImage = function (counter) { + + (new PNotify({ + title: 'Confirmation Needed', + text: 'Are you sure?', + icon: 'fa fa-question-circle', + hide: false, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + } + })).get().on('pnotify.confirm', function () { + $('#imageLoading').show(); + + if (counter == '0') { + var name = 0; + } + else { + var name = $("#" + counter).val() + } + + url = "/docker/removeImage"; + + var data = {name: name}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + console.log(response); + + if (response.data.removeImageStatus === 1) { + new PNotify({ + title: 'Image(s) removed', + type: 'success' + }); + window.location.href = "/docker/manageImages"; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + } + $('#imageLoading').hide(); + } + + function cantLoadInitialData(response) { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + $('#imageLoading').hide(); + } + + }) + } +}); \ No newline at end of file diff --git a/dockerManager/templates/dockerManager/runContainer.html b/dockerManager/templates/dockerManager/runContainer.html new file mode 100644 index 000000000..fde7d81d5 --- /dev/null +++ b/dockerManager/templates/dockerManager/runContainer.html @@ -0,0 +1,197 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Run new container - CyberPanel" %}{% endblock %} +{% block content %} + +{% load static %} +{% get_current_language as LANGUAGE_CODE %} + + +
{% trans "Modify parameters for your new container" %}
+
+