bug fix: web terminal for ubuntu

This commit is contained in:
Usman Nasir
2019-11-04 23:05:13 +05:00
parent 9897939a4a
commit 95a953a0a8
8 changed files with 213 additions and 196 deletions

View File

@@ -1,12 +1,14 @@
import os
import asyncio
import websockets
import paramiko
import json
import signal
import sys
import ssl
from SimpleWebSocketServer import WebSocket, SimpleSSLWebSocketServer
import paramiko
import os
import json
import threading as multi
import time
class WebSocketServer:
class SSHServer(multi.Thread):
def loadPublicKey(self):
pubkey = '/root/.ssh/cyberpanel.pub'
@@ -22,16 +24,13 @@ class WebSocketServer:
except:
pass
if checker:
writeToFile = open(authFile, 'a')
writeToFile.writelines(data)
writeToFile.close()
def __init__(self, websocket, path):
self.websockets = websocket
self.path = path
def __init__(self, websocket):
multi.Thread.__init__(self)
self.sshclient = paramiko.SSHClient()
self.sshclient.load_system_host_keys()
self.sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
@@ -43,96 +42,64 @@ class WebSocketServer:
self.sshclient.connect('127.0.0.1', 22, username='root', pkey=k)
self.shell = self.sshclient.invoke_shell(term='xterm')
self.shell.settimeout(0)
self.verifyPath = ''
async def consumer_handler(self):
try:
async for message in self.websockets:
await self.sendData(message)
except:
print(self.verifyPath)
os.remove(self.verifyPath)
self.websocket = websocket
async def producer_handler(self):
try:
def recvData(self):
while True:
message = await self.recvData()
if os.path.exists(self.verifyPath):
await self.websockets.send(message)
else:
await self.websockets.send('Authentication failed.')
except:
print(self.verifyPath)
os.remove(self.verifyPath)
async def recvData(self):
try:
print ('recvData')
try:
while True:
if os.path.exists(self.websocket.verifyPath):
if self.shell.recv_ready():
return self.shell.recv(9000).decode("utf-8")
self.websocket.sendMessage(self.shell.recv(9000).decode("utf-8"))
else:
await asyncio.sleep(0.1)
continue
except:
pass
except:
print(self.verifyPath)
os.remove(self.verifyPath)
time.sleep(0.1)
except BaseException, msg:
time.sleep(2)
async def sendData(self, message):
def run(self):
try:
print ('sendData')
print (str(message))
self.recvData()
except BaseException, msg:
print(str(msg))
class WebTerminalServer(WebSocket):
def handleMessage(self):
try:
data = json.loads(message)
if str(message).find('"tp":"init"') > -1:
data = json.loads(self.data)
if str(self.data).find('"tp":"init"') > -1:
self.verifyPath = str(data['data']['verifyPath'])
else:
if os.path.exists(self.verifyPath):
self.shell.send(str(data['data']))
except:
pass
except:
print(self.verifyPath)
os.remove(self.verifyPath)
@staticmethod
async def initialize(websocket, path):
def handleConnected(self):
self.sh = SSHServer(self)
self.shell = self.sh.shell
self.sh.start()
def handleClose(self):
try:
webshell = WebSocketServer(websocket, path)
consumer_task = asyncio.ensure_future(
webshell.consumer_handler())
producer_task = asyncio.ensure_future(
webshell.producer_handler())
done, pending = await asyncio.wait(
[consumer_task, producer_task],
return_when=asyncio.FIRST_COMPLETED,
)
for task in pending:
task.cancel()
os.remove(self.verifyPath)
except:
print(webshell.verifyPath)
os.remove(webshell.verifyPath)
pass
def main():
if __name__ == "__main__":
pidfile = '/usr/local/CyberCP/WebTerminal/pid'
writeToFile = open(pidfile, 'w')
writeToFile.write(str(os.getpid()))
writeToFile.close()
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/usr/local/lscp/conf/cert.pem', '/usr/local/lscp/conf/key.pem')
start_server = websockets.serve(WebSocketServer.initialize, '', 5678, ssl=context)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
server = SimpleSSLWebSocketServer('0.0.0.0', '5678', WebTerminalServer, '/usr/local/lscp/conf/cert.pem', '/usr/local/lscp/conf/key.pem', version=ssl.PROTOCOL_TLSv1)
def close_sig_handler(signal, frame):
server.close()
sys.exit()
if __name__ == "__main__":
main()
signal.signal(signal.SIGINT, close_sig_handler)
server.serveforever()

View File

@@ -3,9 +3,9 @@ Description = CyberPanel SSH Websocket Daemon
[Service]
Type=forking
ExecStart = /usr/local/CyberPanel/p3/bin/python3 /usr/local/CyberCP/WebTerminal/servCTRL.py start
ExecStop = /usr/local/CyberPanel/p3/bin/python3 /usr/local/CyberCP/WebTerminal/servCTRL.py stop
Restart = /usr/local/CyberPanel/p3/bin/python3 /usr/local/CyberCP/WebTerminal/servCTRL.py restart
ExecStart = /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/WebTerminal/servCTRL.py start
ExecStop = /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/WebTerminal/servCTRL.py stop
Restart = /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/WebTerminal/servCTRL.py restart
Restart=on-abnormal
[Install]

View File

@@ -20,7 +20,7 @@ class servCTRL:
if os.path.exists(servCTRL.pidfile):
self.stop()
command = '/usr/local/CyberPanel/p3/bin/python3 /usr/local/CyberCP/WebTerminal/CPWebSocket.py'
command = '/usr/local/CyberCP/bin/python2 /usr/local/CyberCP/WebTerminal/CPWebSocket.py'
subprocess.Popen(shlex.split(command))
def stop(self):

View File

@@ -3610,67 +3610,6 @@ milter_default_action = accept
command = "virtualenv --system-site-packages /usr/local/CyberCP"
res = subprocess.call(shlex.split(command))
### Virtual Env 3
if distro == centos:
command = 'yum -y install python36 -y'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
command = 'virtualenv -p python3 /usr/local/CyberPanel/p3'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
env_path = '/usr/local/CyberPanel/p3'
subprocess.call(['virtualenv', env_path])
activate_this = os.path.join(env_path, 'bin', 'activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
command = "pip3 install --ignore-installed -r %s" % ('/usr/local/CyberCP/WebTerminal/requirments.txt')
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
else:
command = 'apt install -y python3-pip'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
command = 'apt install build-essential libssl-dev libffi-dev python3-dev -y'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
command = 'apt install -y python3-venv'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
command = 'virtualenv -p python3 /usr/local/CyberPanel/p3'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
env_path = '/usr/local/CyberPanel/p3'
subprocess.call(['virtualenv', env_path])
activate_this = os.path.join(env_path, 'bin', 'activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
command = "pip3 install --ignore-installed -r %s" % ('/usr/local/CyberCP/WebTerminal/requirments.txt')
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
except OSError, msg:
logging.InstallLog.writeToFile(str(msg) + " [setupVirtualEnv]")
return 0
@@ -3761,6 +3700,62 @@ milter_default_action = accept
except:
pass
@staticmethod
def p3(distro):
### Virtual Env 3
if distro == centos:
command = 'yum -y install python36 -y'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
command = 'virtualenv -p python3 /usr/local/CyberPanel/p3'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
env_path = '/usr/local/CyberPanel/p3'
subprocess.call(['virtualenv', env_path])
activate_this = os.path.join(env_path, 'bin', 'activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
command = "pip3 install --ignore-installed -r %s" % ('/usr/local/CyberCP/WebTerminal/requirments.txt')
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
else:
command = 'apt install -y python3-pip'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
command = 'apt install build-essential libssl-dev libffi-dev python3-dev -y'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
command = 'apt install -y python3-venv'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
command = 'virtualenv -p python3 /usr/local/CyberPanel/p3'
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
env_path = '/usr/local/CyberPanel/p3'
subprocess.call(['virtualenv', env_path])
activate_this = os.path.join(env_path, 'bin', 'activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
command = "pip3 install --ignore-installed -r %s" % ('/usr/local/CyberCP/WebTerminal/requirments.txt')
preFlightsChecks.call(command, distro, '[install python36]',
'install python36',
1, 0, os.EX_OSERR)
def installRestic(self):
try:
@@ -3967,6 +3962,7 @@ def main():
checks.enableDisableFTP('On', distro)
checks.setUpFirstAccount()
#checks.p3(distro)
logging.InstallLog.writeToFile("CyberPanel installation successfully completed!")
checks.installation_successfull()

Binary file not shown.

View File

@@ -3,12 +3,20 @@
# This file is distributed under the same license as the CyberPanel package.
# FIRST AUTHOR <unasir@litespeedtech.com>, 2017.
#
#: baseTemplate/templates/baseTemplate/index.html:220
#: baseTemplate/templates/baseTemplate/index.html:273
#: baseTemplate/templates/baseTemplate/index.html:280
#: baseTemplate/templates/baseTemplate/index.html:287
#: baseTemplate/templates/baseTemplate/index.html:294
#: baseTemplate/templates/baseTemplate/index.html:301
#: baseTemplate/templates/baseTemplate/index.html:308
#: emailMarketing/templates/emailMarketing/sendEmails.html:93
msgid ""
msgstr ""
"Project-Id-Version: CyberPanel\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-30 00:05+0500\n"
"PO-Revision-Date: 2019-11-04 01:13+0900\n"
"PO-Revision-Date: 2019-10-27 23:29+0900\n"
"Last-Translator: @ kazuo210 <kazu.nito@gmail.com>\n"
"Language-Team: LANGUAGE <unasir@litespeedtech.com>\n"
"Language: ja\n"
@@ -319,7 +327,7 @@ msgstr "イタリア語"
#: CyberCP/settings.py:189
msgid "Deutsch"
msgstr "ドイツ語"
msgstr ""
#: IncBackups/templates/IncBackups/backupSchedule.html:3
#: backup/templates/backup/backupSchedule.html:3
@@ -367,8 +375,10 @@ msgstr "実行間隔を選択"
#: IncBackups/templates/IncBackups/backupSchedule.html:54
#: IncBackups/templates/IncBackups/createBackup.html:56
#, fuzzy
#| msgid "Backup Management"
msgid "Backup Content"
msgstr "バックアップコンテンツ"
msgstr "バックアップ管理"
#: IncBackups/templates/IncBackups/backupSchedule.html:98
#: IncBackups/templates/IncBackups/incrementalDestinations.html:72
@@ -386,7 +396,7 @@ msgstr "アカウントを検索。"
#: IncBackups/templates/IncBackups/backupSchedule.html:124
msgid "Select sites to be included in this job"
msgstr "このジョブに含めるサイトを選択してください"
msgstr ""
#: IncBackups/templates/IncBackups/backupSchedule.html:150
#: IncBackups/templates/IncBackups/createBackup.html:127
@@ -449,8 +459,10 @@ msgid "Delete"
msgstr "削除"
#: IncBackups/templates/IncBackups/createBackup.html:3
#, fuzzy
#| msgid "Cancel Backup"
msgid "Create Incremental Backup"
msgstr "増分バックアップを作成します"
msgstr "バックアップを中止"
#: IncBackups/templates/IncBackups/createBackup.html:13
#: IncBackups/templates/IncBackups/createBackup.html:23
@@ -468,8 +480,10 @@ msgid "Backup Docs"
msgstr "バックアップのドキュメント"
#: IncBackups/templates/IncBackups/createBackup.html:17
#, fuzzy
#| msgid "This page can be used to Back up your websites"
msgid "This page can be used to create incremental backups for your websites."
msgstr "このページを使用して、Web サイトの増分バックアップを作成できます"
msgstr "このページ、Web サイトバックアップするために使用することができます"
#: IncBackups/templates/IncBackups/createBackup.html:33
#: IncBackups/templates/IncBackups/restoreRemoteBackups.html:35
@@ -523,7 +537,7 @@ msgstr "ジョブ ID"
#: IncBackups/templates/IncBackups/createBackup.html:162
#: IncBackups/templates/IncBackups/restoreRemoteBackups.html:97
msgid "Snapshot ID"
msgstr "スナップショット ID"
msgstr ""
#: IncBackups/templates/IncBackups/createBackup.html:163
#: dns/templates/dns/addDeleteDNSRecords.html:327
@@ -543,20 +557,28 @@ msgid "Set up Back up Destinations"
msgstr "バックアップ先の設定"
#: IncBackups/templates/IncBackups/incrementalDestinations.html:14
#, fuzzy
#| msgid "Set up Back up Destinations"
msgid "Set up Incremental Back up Destinations"
msgstr "増分バックアップ先設定します"
msgstr "バックアップ先設定"
#: IncBackups/templates/IncBackups/incrementalDestinations.html:20
#, fuzzy
#| msgid "On this page you can set up your Back up destinations. (SFTP)"
msgid "On this page you can set up your Back up destinations. (SFTP and AWS)"
msgstr "このページでは、バックアップ先を設定できます。 SFTPおよびAWS"
msgstr "このページでは、バックアップ先を設定できます。 SFTP"
#: IncBackups/templates/IncBackups/incrementalDestinations.html:26
#, fuzzy
#| msgid "Set up Back up Destinations"
msgid "Set up Back up Destinations."
msgstr "バックアップ先設定します。"
msgstr "バックアップ先設定"
#: IncBackups/templates/IncBackups/incrementalDestinations.html:35
#, fuzzy
#| msgid "Select Template"
msgid "Select Type"
msgstr "種類の選択"
msgstr "テンプレートの選択"
#: IncBackups/templates/IncBackups/incrementalDestinations.html:47
#: backup/templates/backup/backupDestinations.html:30
@@ -609,27 +631,28 @@ msgstr "IP"
#: IncBackups/templates/IncBackups/incrementalDestinations.html:117
#: IncBackups/templates/IncBackups/incrementalDestinations.html:153
msgid "AWS_ACCESS_KEY_ID"
msgstr "AWS_ACCESS_KEY_ID"
msgstr ""
#: IncBackups/templates/IncBackups/incrementalDestinations.html:124
msgid "AWS_SECRET_ACCESS_KEY"
msgstr "AWS_SECRET_ACCESS_KEY"
msgstr ""
#: IncBackups/templates/IncBackups/restoreRemoteBackups.html:3
#: IncBackups/templates/IncBackups/restoreRemoteBackups.html:13
msgid "Restore Remote Incremental Backups"
msgstr "リモート増分バックアップの復元"
msgstr ""
#: IncBackups/templates/IncBackups/restoreRemoteBackups.html:19
#, fuzzy
#| msgid "This page can be used to Back up your websites"
msgid ""
"This page can be used to restore remote incremental backups for your "
"websites."
msgstr ""
"このページを使用して、Web サイトのリモート増分バックアップを復元できます。"
msgstr "このページは、Web サイトをバックアップするために使用することができます"
#: IncBackups/templates/IncBackups/restoreRemoteBackups.html:69
msgid "Fetch Restore Points"
msgstr "復元ポイントの取得"
msgstr ""
#: IncBackups/templates/IncBackups/restoreRemoteBackups.html:99
#: emailMarketing/templates/emailMarketing/manageSMTPHosts.html:76
@@ -809,11 +832,11 @@ msgstr "接続を確認"
#: backup/templates/backup/backupSchedule.html:54
msgid "Local Path"
msgstr "ローカルパス"
msgstr ""
#: backup/templates/backup/backupSchedule.html:57
msgid "Local directory where backups will be moved after creation."
msgstr "作成後にバックアップを移動するローカルディレクトリ。"
msgstr ""
#: backup/templates/backup/backupSchedule.html:82
msgid "Cannot add schedule. Error message:"
@@ -1437,12 +1460,16 @@ msgid "Create Nameserver"
msgstr "ネームサーバーの作成"
#: baseTemplate/templates/baseTemplate/index.html:489
#, fuzzy
#| msgid "Create Nameserver"
msgid "Configure Default Nameservers"
msgstr "デフォルトネームサーバーの設定"
msgstr "ネームサーバーの作成"
#: baseTemplate/templates/baseTemplate/index.html:489
#, fuzzy
#| msgid "Create Nameserver"
msgid "Config Default Nameservers"
msgstr "デフォルトネームサーバーの設定"
msgstr "ネームサーバーの作成"
#: baseTemplate/templates/baseTemplate/index.html:492
#: dns/templates/dns/createDNSZone.html:12
@@ -1579,31 +1606,43 @@ msgstr "バックアップ先の追加/削除"
#: baseTemplate/templates/baseTemplate/index.html:591
msgid "Incremental Back up - Beta"
msgstr "増分バックアップ - ベータ版"
msgstr ""
#: baseTemplate/templates/baseTemplate/index.html:593
#, fuzzy
#| msgid "Cancel Backup"
msgid "Incremental Back up"
msgstr "増分バックアップ"
msgstr "バックアップを中止"
#: baseTemplate/templates/baseTemplate/index.html:599
#, fuzzy
#| msgid "Restore Back up"
msgid "Create/Restore Back up"
msgstr "バックアップの作成/復元"
msgstr "バックアップの復元"
#: baseTemplate/templates/baseTemplate/index.html:602
#, fuzzy
#| msgid "Add/Delete Destinations"
msgid "Add/Remove Destinations"
msgstr "宛先の追加/削除"
#: baseTemplate/templates/baseTemplate/index.html:605
#, fuzzy
#| msgid "Schedule Back up"
msgid "Schedule Back ups"
msgstr "バックアップスケジュール"
#: baseTemplate/templates/baseTemplate/index.html:608
#, fuzzy
#| msgid "Transfer Websites from Remote Server - CyberPanel"
msgid "Restore from Remote Server"
msgstr "リモート サーバーからの復元"
msgstr "リモートサーバーからWebサイトを転送 - CyberPanel"
#: baseTemplate/templates/baseTemplate/index.html:608
#, fuzzy
#| msgid "Restore Website"
msgid "Restore from Remote"
msgstr "リモートから復元"
msgstr "Web サイトの復元"
#: baseTemplate/templates/baseTemplate/index.html:625
#: manageSSL/templates/manageSSL/index.html:29
@@ -2322,12 +2361,16 @@ msgid "Record Successfully Added."
msgstr "レコードが追加されました。"
#: dns/templates/dns/configureDefaultNameServers.html:3
#, fuzzy
#| msgid "Create Nameserver - CyberPanel"
msgid "Configure Default Nameserver - CyberPanel"
msgstr "デフォルトネームサーバーの設定 - CyberPanel"
msgstr "ネームサーバーの作成 - CyberPanel"
#: dns/templates/dns/configureDefaultNameServers.html:12
#, fuzzy
#| msgid "Create Nameserver"
msgid "Configure Default Nameserver"
msgstr "デフォルトネームサーバーの設定"
msgstr "ネームサーバーの作成"
#: dns/templates/dns/configureDefaultNameServers.html:13
#: dns/templates/dns/createNameServer.html:13
@@ -2351,16 +2394,22 @@ msgid "First Nameserver"
msgstr "ファーストネームサーバー"
#: dns/templates/dns/configureDefaultNameServers.html:45
#, fuzzy
#| msgid "Second Nameserver (Back up)"
msgid "Second Nameserver"
msgstr "セカンドネームサーバー"
msgstr "セカンドネームサーバー(バックアップ)"
#: dns/templates/dns/configureDefaultNameServers.html:52
#, fuzzy
#| msgid "First Nameserver"
msgid "Third Nameserver"
msgstr "サードネームサーバー"
msgstr "ファーストネームサーバー"
#: dns/templates/dns/configureDefaultNameServers.html:59
#, fuzzy
#| msgid "First Nameserver"
msgid "Forth Nameserver"
msgstr "前のネームサーバー"
msgstr "ファーストネームサーバー"
#: dns/templates/dns/configureDefaultNameServers.html:68
#: emailMarketing/templates/emailMarketing/website.html:656
@@ -3651,8 +3700,10 @@ msgstr "SpamAssassin 設定が保存されました。"
#: emailPremium/templates/emailPremium/emailLimits.html:13
#: emailPremium/templates/emailPremium/listDomains.html:14
#: emailPremium/templates/emailPremium/policyServer.html:13
#, fuzzy
#| msgid "Emai Limits Docs"
msgid "Email Limits Docs"
msgstr "メール制限ドキュメント"
msgstr "メール制限ドキュメント"
#: emailPremium/templates/emailPremium/emailLimits.html:14
msgid "View and change email limits for a domain name."
@@ -4665,8 +4716,10 @@ msgid "This page help you setup email forwarding for your emails."
msgstr "このページは、メールのメール転送を設定するのに役立ちます。"
#: mailServer/templates/mailServer/emailForwarding.html:61
#, fuzzy
#| msgid "Forwarding Docs"
msgid "Forwarding Options"
msgstr "転送オプション"
msgstr "ドキュメントの転送"
#: mailServer/templates/mailServer/emailForwarding.html:97
#: mailServer/templates/mailServer/emailForwarding.html:118
@@ -4675,7 +4728,7 @@ msgstr "送信元"
#: mailServer/templates/mailServer/emailForwarding.html:101
msgid "or path to the program"
msgstr "またはプログラムへのパス"
msgstr ""
#: mailServer/templates/mailServer/emailForwarding.html:106
msgid "Forward Email"
@@ -5313,8 +5366,10 @@ msgid "Switch to LiteSpeed Enterprise Web Server"
msgstr "LiteSpeed Enterprise Web Server に切り替えます"
#: serverStatus/templates/serverStatus/litespeedStatus.html:149
#, fuzzy
#| msgid "LiteSpeed Processes"
msgid "LiteSpeed Serial No. (License Key)"
msgstr "LiteSpeed シリアル番号(ライセンスキー)"
msgstr "LiteSpeed 操作"
#: serverStatus/templates/serverStatus/litespeedStatus.html:160
msgid "Switch"
@@ -5322,7 +5377,7 @@ msgstr "切り替え"
#: serverStatus/templates/serverStatus/litespeedStatus.html:162
msgid "Get 15 Days Trial"
msgstr "15日間のトライアルを取得する"
msgstr ""
#: serverStatus/templates/serverStatus/litespeedStatus.html:175
msgid ""
@@ -5330,9 +5385,6 @@ msgid ""
"CyberPanel will auto fetch 15 days trial key for you. Make sure this server "
"have not used trial already."
msgstr ""
"注15 日間のトライアルを選択した場合、シリアルキーを入力する必要はありませ"
"ん。CyberPanel は15日間の試用版キーを自動的に取得します。 このサーバーがまだ"
"試用版を使用していないことを確認してください。"
#: serverStatus/templates/serverStatus/litespeedStatus.html:193
msgid "With great wisdom comes great responsibility."

View File

@@ -1982,7 +1982,7 @@ failovermethod=priority
Upgrade.someDirectories()
Upgrade.installLSCPD()
Upgrade.GeneralMigrations()
Upgrade.p3()
#Upgrade.p3()
if os.path.exists(postfixPath):
Upgrade.upgradeDovecot()

View File

@@ -11,7 +11,7 @@ cffi==1.11.5
chardet==3.0.4
ConfigArgParse==0.13.0
configobj==4.7.2
cryptography==2.2.2
cryptography==2.8
decorator==3.4.0
docker==3.6.0
docker-pycreds==0.4.0
@@ -47,6 +47,8 @@ pyliblzma==0.5.3
pyOpenSSL==17.5.0
pyRFC3339==1.1
pyserial==2.6
paramiko==2.6.0
SimpleWebSocketServer==0.1.1
python-dateutil==2.7.5
pytz==2018.4
pyudev==0.15