port docker manager to ubuntu

This commit is contained in:
usmannasir
2019-01-09 14:55:10 +05:00
parent fd084580f6
commit f9bfccee60
11 changed files with 1337 additions and 981 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,48 +3,64 @@
{% block title %}{% trans "Install Docker - CyberPanel" %}{% endblock %} {% block title %}{% trans "Install Docker - CyberPanel" %}{% endblock %}
{% block content %} {% block content %}
{% load static %} {% load static %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} --> <!-- Current language: {{ LANGUAGE_CODE }} -->
<div class="container">
<div id="page-title">
<h2>{% trans "Install Docker" %}</h2>
</div>
<div ng-controller="installDocker" class="panel">
<div class="panel-body">
<h3 class="title-hero">
{% trans "Install Docker" %} <img ng-hide="installDockerStatus" src="{% static 'images/loading.gif' %}">
</h3>
<div class="example-box-wrapper">
{% if conErr == 1%}
{% if status == 1 %}
{% trans "Unable to connect to docker daemon, please try restarting docker from service page" %}
{% else %}
{% trans "You do not have sufficient permissions to access this page" %}
{% endif %}
{% else %}
<p>{% trans "Docker is currently not installed on this server. To manage containers, you must first install it." %}</p>
<br>
{% if status == 1 %}
<button class="btn btn-primary" ng-click="installDocker()">Install Docker</button>
{% else %}
{% trans "You do not have permissions to install Docker. Please contact your system administrator" %}
{% endif %}
{% endif %}
<div class="container">
<div id="page-title">
<h2>{% trans "Install Docker" %}</h2>
</div> </div>
<div ng-controller="installDocker" class="panel">
<div class="panel-body">
<h3 class="title-hero">
{% trans "Install Docker" %} <img ng-hide="installDockerStatus"
src="{% static 'images/loading.gif' %}">
</h3>
<div class="example-box-wrapper">
{% if conErr == 1 %}
{% if status == 1 %}
{% trans "Unable to connect to docker daemon, please try restarting docker from service page" %}
{% else %}
{% trans "You do not have sufficient permissions to access this page" %}
{% endif %}
{% else %}
<p>{% trans "Docker is currently not installed on this server. To manage containers, you must first install it." %}</p>
<!------ LSWS Switch box ----------------->
<div style="margin-top: 2%" ng-hide="installBoxGen" class="col-md-12">
<form action="/" id="" class="form-horizontal bordered-row">
<div class="form-group">
<div style="margin-top: 2%;" class="col-sm-12">
<textarea ng-model="requestData" rows="15"
class="form-control">{{ requestData }}</textarea>
</div>
</div>
</form>
</div>
<!----- LSWS Switch box ----------------->
<br>
{% if status == 1 %}
<button ng-hide="dockerInstallBTN" class="btn btn-primary" ng-click="installDocker()">Install Docker</button>
{% else %}
{% trans "You do not have permissions to install Docker. Please contact your system administrator" %}
{% endif %}
{% endif %}
</div>
</div>
</div>
</div> </div>
</div>
</div>
{% endblock %} {% endblock %}

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.shortcuts import render,redirect from django.shortcuts import render, redirect, HttpResponse
from loginSystem.models import Administrator from loginSystem.models import Administrator
from loginSystem.views import loadLoginPage from loginSystem.views import loadLoginPage
from plogical.container import ContainerManager from plogical.container import ContainerManager
from dockerManager.pluginManager import pluginManager
from decorators import preDockerRun from decorators import preDockerRun
from plogical.acl import ACLManager from plogical.acl import ACLManager
import json import json
@@ -22,7 +21,7 @@ def dockerPermission(request, userID, context):
else: else:
return ACLManager.loadError() return ACLManager.loadError()
else: else:
return None return 0
@preDockerRun @preDockerRun
def loadDockerHome(request): def loadDockerHome(request):
@@ -41,22 +40,18 @@ def installDocker(request):
userID = request.session['userID'] userID = request.session['userID']
perm = dockerPermission(request, userID, 'loadDockerHome') perm = dockerPermission(request, userID, 'loadDockerHome')
if perm: return perm if perm: return perm
result = pluginManager.preDockerInstallation(request) # Later change to preInstallInstallation
if result != 200: cm = ContainerManager(userID, 'submitInstallDocker')
return result cm.start()
cm = ContainerManager() data_ret = {'status': 1, 'error_message': 'None'}
coreResult = cm.submitInstallDocker(userID, json.loads(request.body)) json_data = json.dumps(data_ret)
return HttpResponse(json_data)
result = pluginManager.postDockerInstallation(request, coreResult) except BaseException, msg:
if result != 200: data_ret = {'status': 0, 'error_message': str(msg)}
return result json_data = json.dumps(data_ret)
return HttpResponse(json_data)
return coreResult
except KeyError:
return redirect(loadLoginPage)
@preDockerRun @preDockerRun
def installImage(request): def installImage(request):
@@ -332,6 +327,7 @@ def manageImages(request):
def getImageHistory(request): def getImageHistory(request):
try: try:
userID = request.session['userID'] userID = request.session['userID']
perm = dockerPermission(request, userID, 'loadDockerHome') perm = dockerPermission(request, userID, 'loadDockerHome')
if perm: return perm if perm: return perm

View File

@@ -780,8 +780,8 @@ class preFlightsChecks:
os.chdir(self.path) os.chdir(self.path)
command = "wget http://cyberpanel.sh/CyberPanel.1.7.7.tar.gz" #command = "wget http://cyberpanel.sh/CyberPanel.1.7.7.tar.gz"
#command = "wget http://cyberpanel.sh/CyberPanelTemp.tar.gz" command = "wget http://cyberpanel.sh/CyberPanelTemp.tar.gz"
preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]', preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]',
'CyberPanel Download', 'CyberPanel Download',
1, 1, os.EX_OSERR) 1, 1, os.EX_OSERR)
@@ -789,8 +789,8 @@ class preFlightsChecks:
## ##
count = 0 count = 0
command = "tar zxf CyberPanel.1.7.7.tar.gz" #command = "tar zxf CyberPanel.1.7.7.tar.gz"
#command = "tar zxf CyberPanelTemp.tar.gz" command = "tar zxf CyberPanelTemp.tar.gz"
preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]', preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]',
'Extract CyberPanel',1, 1, os.EX_OSERR) 'Extract CyberPanel',1, 1, os.EX_OSERR)
@@ -2667,27 +2667,15 @@ class preFlightsChecks:
return 0 return 0
def installPYDNS(self): def installPYDNS(self):
try: command = "pip install pydns"
count = 0 preFlightsChecks.call(command, self.distro, '[installPYDNS]',
while (1): 'Install PYDNS',
command = "pip install pydns" 1, 0, os.EX_OSERR)
def installDockerPY(self):
res = subprocess.call(shlex.split(command)) command = "pip install docker"
preFlightsChecks.call(command, self.distro, '[installDockerPY]',
if preFlightsChecks.resFailed(self.distro, res): 'Install DockerPY',
count = count + 1 1, 0, os.EX_OSERR)
preFlightsChecks.stdOut(
"Trying to install pydns, trying again, try number: " + str(count))
if count == 3:
logging.InstallLog.writeToFile(
"Failed to install pydns! [installTLDExtract]")
else:
logging.InstallLog.writeToFile("pydns successfully installed! [pip]")
preFlightsChecks.stdOut("pydns successfully installed! [pip]")
break
except OSError, msg:
logging.InstallLog.writeToFile(str(msg) + " [installTLDExtract]")
return 0
def installOpenDKIM(self): def installOpenDKIM(self):
try: try:
@@ -3289,6 +3277,7 @@ def main():
checks.installCertBot() checks.installCertBot()
checks.test_Requests() checks.test_Requests()
checks.installPYDNS() checks.installPYDNS()
checks.installDockerPY()
checks.download_install_CyberPanel(installCyberPanel.InstallCyberPanel.mysqlPassword, mysql) checks.download_install_CyberPanel(installCyberPanel.InstallCyberPanel.mysqlPassword, mysql)
checks.setupCLI() checks.setupCLI()
checks.setup_cron() checks.setup_cron()

View File

@@ -453,7 +453,6 @@ class ACLManager:
@staticmethod @staticmethod
def checkContainerOwnership(name, userID): def checkContainerOwnership(name, userID):
return 1
try: try:
container = Containers.objects.get(name=name) container = Containers.objects.get(name=name)
currentACL = ACLManager.loadedACL(userID) currentACL = ACLManager.loadedACL(userID)
@@ -513,7 +512,7 @@ class ACLManager:
for items in admins: for items in admins:
cons = items.containers_set.all() cons = items.containers_set.all()
for con in cons: for con in cons:
containerList.append(web) containerList.append(con)
return containerList return containerList

View File

@@ -18,54 +18,88 @@ import subprocess
import shlex import shlex
import time import time
from dockerManager.models import Containers from dockerManager.models import Containers
from django.http import StreamingHttpResponse
from wsgiref.util import FileWrapper
from math import ceil from math import ceil
import docker import docker
import docker.utils import docker.utils
import requests import requests
from processUtilities import ProcessUtilities
from serverStatus.serverStatusUtil import ServerStatusUtil
import threading as multi
# Use default socket to connect # Use default socket to connect
class ContainerManager: class ContainerManager(multi.Thread):
def __init__(self, name=None):
self.name = name
def submitInstallDocker(self, userID=None, data=None): def __init__(self, name=None, function=None):
multi.Thread.__init__(self)
self.name = name
self.function = function
def run(self):
try: try:
currentACL = ACLManager.loadedACL(userID) if self.function == 'submitInstallDocker':
self.submitInstallDocker()
elif self.function == 'restartGunicorn':
command = 'sudo systemctl restart gunicorn.socket'
ProcessUtilities.executioner(command)
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile( str(msg) + ' [ContainerManager.run]')
@staticmethod
def executioner(command, statusFile):
try:
res = subprocess.call(shlex.split(command), stdout=statusFile, stderr=statusFile)
if res == 1:
return 0
else:
return 1
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg))
return 0
def submitInstallDocker(self):
try:
currentACL = ACLManager.loadedACL(self.name)
if ACLManager.currentContextPermission(currentACL, 'createContainer') == 0: if ACLManager.currentContextPermission(currentACL, 'createContainer') == 0:
return ACLManager.loadError() return ACLManager.loadError()
command = 'sudo yum install -y docker' statusFile = open(ServerStatusUtil.lswsInstallStatusPath, 'w')
cmd = shlex.split(command)
res = subprocess.call(cmd) logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath,
"Starting Docker Installation..\n", 1)
if ProcessUtilities.decideDistro() == ProcessUtilities.centos:
command = 'sudo yum install -y docker'
else:
command = 'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker.io'
if not ServerStatusUtil.executioner(command, statusFile):
logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath,
"Failed to install Docker. [404]\n", 1)
return 0
command = 'sudo groupadd docker' command = 'sudo groupadd docker'
cmd = shlex.split(command) ServerStatusUtil.executioner(command, statusFile)
res2 = subprocess.call(cmd)
command = 'sudo usermod -aG docker cyberpanel' command = 'sudo usermod -aG docker cyberpanel'
cmd = shlex.split(command) ServerStatusUtil.executioner(command, statusFile)
res3 = subprocess.call(cmd)
command = 'sudo service docker start' command = 'sudo systemctl enable docker'
cmd = shlex.split(command) ServerStatusUtil.executioner(command, statusFile)
res4 = subprocess.call(cmd)
if res == 0 and res2 == 0 and res3 == 0 and res4 == 0: command = 'sudo systemctl start docker'
data_ret = {'installDockerStatus': 1, 'error_message': 'None'} ServerStatusUtil.executioner(command, statusFile)
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
else:
data_ret = {'installDockerStatus': 0, 'error_message': 'Failed to install. Manual install required.'}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
return HttpResponse(res) cm = ContainerManager(self.name, 'restartGunicorn')
cm.start()
logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath,
"Docker successfully installed.[200]\n", 1)
except BaseException, msg: except BaseException, msg:
return HttpResponse(str(msg)) logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath, str(msg) + ' [404].', 1)
def createContainer(self, request=None, userID=None, data=None): def createContainer(self, request=None, userID=None, data=None):
try: try:
@@ -779,9 +813,6 @@ class ContainerManager:
name = data['name'] name = data['name']
if ACLManager.checkContainerOwnership(name, userID) != 1:
return ACLManager.loadError()
client = docker.from_env() client = docker.from_env()
dockerAPI = docker.APIClient() dockerAPI = docker.APIClient()
@@ -808,6 +839,7 @@ class ContainerManager:
def removeImage(self, userID=None, data=None): def removeImage(self, userID=None, data=None):
try: try:
admin = Administrator.objects.get(pk=userID) admin = Administrator.objects.get(pk=userID)
if admin.acl.adminStatus != 1: if admin.acl.adminStatus != 1:
return ACLManager.loadError() return ACLManager.loadError()

View File

@@ -21,7 +21,10 @@ class modSec:
mailUtilities.checkHome() mailUtilities.checkHome()
command = 'sudo yum install ols-modsecurity -y' if ProcessUtilities.decideDistro() == ProcessUtilities.centos:
command = 'sudo yum install ols-modsecurity -y'
else:
command = 'sudo DEBIAN_FRONTEND=noninteractive apt-get install ols-modsecurity -y'
cmd = shlex.split(command) cmd = shlex.split(command)

View File

@@ -599,6 +599,40 @@ WantedBy=multi-user.target"""
except: except:
pass pass
@staticmethod
def dockerMigrations():
try:
connection, cursor = Upgrade.setupConnection('cyberpanel')
query = """CREATE TABLE `dockerManager_containers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`cid` varchar(64) NOT NULL,
`image` varchar(50) NOT NULL,
`tag` varchar(50) NOT NULL,
`memory` int(11) NOT NULL,
`ports` longtext NOT NULL,
`env` longtext NOT NULL,
`startOnReboot` int(11) NOT NULL,
`admin_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `dockerManager_contai_admin_id_58fb62b7_fk_loginSyst` (`admin_id`),
CONSTRAINT `dockerManager_contai_admin_id_58fb62b7_fk_loginSyst` FOREIGN KEY (`admin_id`) REFERENCES `loginSystem_administrator` (`id`)
)"""
try:
cursor.execute(query)
except:
pass
try:
connection.close()
except:
pass
except:
pass
@staticmethod @staticmethod
def enableServices(): def enableServices():
try: try:
@@ -854,6 +888,7 @@ WantedBy=multi-user.target"""
Upgrade.mailServerMigrations() Upgrade.mailServerMigrations()
Upgrade.emailMarketingMigrationsa() Upgrade.emailMarketingMigrationsa()
Upgrade.dockerMigrations()
## ##

BIN
static/images/docker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -394,6 +394,7 @@ app.controller('servicesManager', function ($scope, $http) {
function ListInitialDatas(response) { function ListInitialDatas(response) {
console.log(response.data)
if (response.data.status.litespeed) { if (response.data.status.litespeed) {
$scope.olsStatus = "Running"; $scope.olsStatus = "Running";
@@ -409,8 +410,18 @@ app.controller('servicesManager', function ($scope, $http) {
$scope.olsStop = false; $scope.olsStop = false;
} }
// Update SQL stats if (response.data.status.docker) {
$scope.dockerStatus = "Running";
$scope.dockerStart = false;
$scope.dockerStop = true;
}
else {
$scope.dockerStatus = "Stopped";
$scope.dockerStart = true;
$scope.dockerStop = false;
}
// Update SQL stats
if (response.data.status.mysql) { if (response.data.status.mysql) {
$scope.sqlStatus = "Running"; $scope.sqlStatus = "Running";
$scope.sqlStats = true; $scope.sqlStats = true;
@@ -468,7 +479,7 @@ app.controller('servicesManager', function ($scope, $http) {
} }
}; }
getServiceStatus(); getServiceStatus();
$scope.serviceAction = function (serviceName, action) { $scope.serviceAction = function (serviceName, action) {