From 8ad564d549cf80c3826e31e9cef424b6a0b66246 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 16 Apr 2020 19:00:25 +0500 Subject: [PATCH 01/23] ftp fix --- install/installCyberPanel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index 4cbfc2c9e..e49db88db 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -452,10 +452,10 @@ class InstallCyberPanel: command = 'wget http://mirrors.kernel.org/ubuntu/pool/universe/p/pure-ftpd/pure-ftpd-mysql_1.0.47-3build1_amd64.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' + command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3build1_all.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - command = 'dpkg --install --force-confold pure-ftpd-mysql_1.0.47-3_amd64.deb' + command = 'dpkg --install --force-confold pure-ftpd-mysql_1.0.47-3build1_amd64.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) command = 'systemctl restart pure-ftpd-mysql.service' From aa15d710d5d0c873356a5a871f13d24ec2fa8fdb Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 16 Apr 2020 20:35:37 +0500 Subject: [PATCH 02/23] ftp fix --- install/installCyberPanel.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index 413513217..c955cc92e 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -449,13 +449,13 @@ class InstallCyberPanel: command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-common_1.0.47-3_all.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-common_1.0.47-3_all.deb' + command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-mysql_1.0.47-3_amd64.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3build1_all.deb' + command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - command = 'dpkg --install --force-confold pure-ftpd-mysql_1.0.47-3build1_amd64.deb' + command = 'dpkg --install --force-confold pure-ftpd-mysql_1.0.47-3_amd64.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) command = 'systemctl restart pure-ftpd-mysql.service' From 975f8c33824898f3b59f89983cbab77e31174634 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 16 Apr 2020 21:41:11 +0500 Subject: [PATCH 03/23] ftp fix --- install/installCyberPanel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index c955cc92e..c8305cf6c 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -428,7 +428,7 @@ class InstallCyberPanel: writeDataToFile.close() if self.distro == ubuntu: - command = 'apt install pure-ftpd-mysql -y' + command = 'apt install pure-ftpd-mysql libmariadb3 -y' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) if os.path.exists('/etc/pure-ftpd/db/mysql.conf'): From 8fd2e73d5f82ce11fb562605ed570ebe7d37dbb1 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 17 Apr 2020 07:33:59 +0500 Subject: [PATCH 04/23] bug fix: ftp --- install/install.py | 2 +- install/installCyberPanel.py | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/install/install.py b/install/install.py index cf6663b32..724897789 100755 --- a/install/install.py +++ b/install/install.py @@ -190,7 +190,7 @@ class preFlightsChecks: @staticmethod def pureFTPDServiceName(distro): if distro == ubuntu: - return 'pure-ftpd' + return 'pure-ftpd-mysql' return 'pure-ftpd' @staticmethod diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index c8305cf6c..ee9cce381 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -348,11 +348,11 @@ class InstallCyberPanel: def installPureFTPD(self): if self.distro == ubuntu: - command = 'apt-get -y install ' + install.preFlightsChecks.pureFTPDServiceName(self.distro) + command = 'DEBIAN_FRONTEND=noninteractive apt install pure-ftpd-mysql -y' + os.system(command) else: command = "yum install -y pure-ftpd" - - install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) + install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) ####### Install pureftpd to system startup @@ -428,8 +428,6 @@ class InstallCyberPanel: writeDataToFile.close() if self.distro == ubuntu: - command = 'apt install pure-ftpd-mysql libmariadb3 -y' - install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) if os.path.exists('/etc/pure-ftpd/db/mysql.conf'): os.remove('/etc/pure-ftpd/db/mysql.conf') @@ -446,16 +444,16 @@ class InstallCyberPanel: command = 'echo "40110 40210" > /etc/pure-ftpd/conf/PassivePortRange' subprocess.call(command, shell=True) - command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-common_1.0.47-3_all.deb' + command = 'echo "no" > /etc/pure-ftpd/conf/UnixAuthentication' + subprocess.call(command, shell=True) + + command = 'echo "/etc/pure-ftpd/db/mysql.conf" > /etc/pure-ftpd/conf/MySQLConfigFile' + subprocess.call(command, shell=True) + + command = 'ln -s /etc/pure-ftpd/conf/MySQLConfigFile /etc/pure-ftpd/auth/30mysql' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-mysql_1.0.47-3_amd64.deb' - install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - - command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' - install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - - command = 'dpkg --install --force-confold pure-ftpd-mysql_1.0.47-3_amd64.deb' + command = 'ln -s /etc/pure-ftpd/conf/UnixAuthentication /etc/pure-ftpd/auth/65unix' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) command = 'systemctl restart pure-ftpd-mysql.service' From a94c567bcfda0be42992292b3269f9f3f3cc1e35 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 17 Apr 2020 23:10:08 +0500 Subject: [PATCH 05/23] swtich pure-ftpd to 1.0.47-3 --- install/installCyberPanel.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index ee9cce381..5a63e856a 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -350,6 +350,19 @@ class InstallCyberPanel: if self.distro == ubuntu: command = 'DEBIAN_FRONTEND=noninteractive apt install pure-ftpd-mysql -y' os.system(command) + + command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-common_1.0.47-3_all.deb' + install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) + + command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-mysql_1.0.47-3_amd64.deb' + install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) + + command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' + install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) + + command = 'dpkg --install --force-confold pure-ftpd-mysql_1.0.47-3_amd64.deb' + install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) + else: command = "yum install -y pure-ftpd" install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) From 39ee501fda0dc54f466c2c3868cfb4700104889e Mon Sep 17 00:00:00 2001 From: Michael Ramsey Date: Fri, 24 Apr 2020 13:25:49 -0400 Subject: [PATCH 06/23] Add remote backup user support for non root user. This is experimental patch to hopefully solve https://github.com/usmannasir/cyberpanel/issues/165 --- .../templates/backup/backupDestinations.html | 6 + plogical/backupSchedule.py | 18 +- plogical/backupUtilities.py | 201 +++++++++--------- 3 files changed, 117 insertions(+), 108 deletions(-) diff --git a/backup/templates/backup/backupDestinations.html b/backup/templates/backup/backupDestinations.html index 06a97e21b..689550ccf 100755 --- a/backup/templates/backup/backupDestinations.html +++ b/backup/templates/backup/backupDestinations.html @@ -48,6 +48,12 @@ +
+ +
+ +
+
diff --git a/plogical/backupSchedule.py b/plogical/backupSchedule.py index cfcab181f..48d9a1ef2 100755 --- a/plogical/backupSchedule.py +++ b/plogical/backupSchedule.py @@ -135,7 +135,7 @@ class backupSchedule: return 0, str(msg) @staticmethod - def createBackup(virtualHost, ipAddress, backupLogPath , port): + def createBackup(virtualHost, ipAddress, backupLogPath , port='22', user='root'): try: backupSchedule.remoteBackupLogging(backupLogPath, "Preparing to create backup for: " + virtualHost) @@ -152,7 +152,7 @@ class backupSchedule: backupSchedule.remoteBackupLogging(backupLogPath, "Preparing to send backup for: " + virtualHost +" to " + ipAddress) - backupSchedule.sendBackup(backupPath+".tar.gz", ipAddress, backupLogPath, port) + backupSchedule.sendBackup(backupPath+".tar.gz", ipAddress, backupLogPath, port, user) backupSchedule.remoteBackupLogging(backupLogPath, "Backup for: " + virtualHost + " is sent to " + ipAddress) @@ -180,7 +180,7 @@ class backupSchedule: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupSchedule.createBackup]") @staticmethod - def sendBackup(backupPath, IPAddress, backupLogPath , port): + def sendBackup(backupPath, IPAddress, backupLogPath , port='22', user='root'): try: ## IPAddress of local server @@ -193,7 +193,7 @@ class backupSchedule: ## writeToFile = open(backupLogPath, "a") - command = "sudo scp -o StrictHostKeyChecking=no -P "+port+" -i /root/.ssh/cyberpanel " + backupPath + " root@"+IPAddress+":/home/backup/" + ipAddressLocal + "/" + time.strftime("%a-%b") + "/" + command = "sudo scp -o StrictHostKeyChecking=no -P "+port+" -i /root/.ssh/cyberpanel " + backupPath + " " + user + "@" + IPAddress+":~/backup/" + ipAddressLocal + "/" + time.strftime("%a-%b") + "/" subprocess.call(shlex.split(command), stdout=writeToFile) ## Remove backups already sent to remote destinations @@ -222,6 +222,10 @@ class backupSchedule: data = open(destinations,'r').readlines() ipAddress = data[0].strip("\n") port = data[1].strip("\n") + user = data[2].strip("\n") + + # Set the user to root if not specified aka empty + user = user if bool(user) is not False else 'root' ## IPAddress of local server @@ -241,16 +245,16 @@ class backupSchedule: "Connection to: " + ipAddress + " Failed, please resetup this destination from CyberPanel, aborting.") return 0 else: - ## Create backup dir on remote server + ## Create backup dir on remote server in ~/backup - command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel root@" + ipAddress + " mkdir -p /home/backup/" + ipAddressLocal + "/" + time.strftime( + command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + ipAddress + " mkdir -p ~/backup/" + ipAddressLocal + "/" + time.strftime( "%a-%b") subprocess.call(shlex.split(command)) pass for virtualHost in os.listdir("/home"): if match(r'^[a-zA-Z0-9-]*[a-zA-Z0-9-]{0,61}[a-zA-Z0-9-](?:\.[a-zA-Z0-9-]{2,})+$', virtualHost, M | I): - backupSchedule.createBackup(virtualHost, ipAddress, backupLogPath, port) + backupSchedule.createBackup(virtualHost, ipAddress, backupLogPath, port, user) backupSchedule.remoteBackupLogging(backupLogPath, "Remote backup job completed.\n") diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index 945ae845d..31a299310 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -1,6 +1,8 @@ -import os,sys +import os, sys + sys.path.append('/usr/local/CyberCP') import django + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") try: django.setup() @@ -10,13 +12,14 @@ import pexpect from plogical import CyberCPLogFileWriter as logging import subprocess import shlex -from shutil import make_archive,rmtree +from shutil import make_archive, rmtree from plogical import mysqlUtilities import tarfile from multiprocessing import Process import signal from plogical.installUtilities import installUtilities import argparse + try: from plogical.virtualHostUtilities import virtualHostUtilities from plogical.sslUtilities import sslUtilities @@ -32,6 +35,7 @@ from shutil import copy from distutils.dir_util import copy_tree from random import randint from plogical.processUtilities import ProcessUtilities + try: from websiteFunctions.models import Websites, ChildDomains, Backups from databases.models import Databases @@ -45,12 +49,13 @@ except: VERSION = '2.0' BUILD = 1 + ## I am not the monster that you think I am.. class backupUtilities: Server_root = "/usr/local/lsws" - completeKeyPath = "/home/cyberpanel/.ssh" + completeKeyPath = "/home/cyberpanel/.ssh" destinationsPath = "/home/cyberpanel/destinations" licenseKey = '/usr/local/lsws/conf/license.key' @@ -190,11 +195,9 @@ class backupUtilities: except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( 'While creating backup for %s, we failed to backup database %s. Error message: %s' % ( - backupDomain, items.dbName, str(msg))) + backupDomain, items.dbName, str(msg))) continue - - databaseXML = Element('database') child = SubElement(databaseXML, 'dbName') @@ -276,7 +279,6 @@ class backupUtilities: ## Email meta generated! - def prettify(elem): """Return a pretty-printed XML string for the Element. """ @@ -284,8 +286,6 @@ class backupUtilities: reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent=" ") - - ## /home/example.com/backup/backup-example.com-02.13.2018_10-24-52/meta.xml -- metaPath metaPath = '/tmp/%s' % (str(randint(1000, 9999))) @@ -298,22 +298,21 @@ class backupUtilities: ## meta generated - newBackup = Backups(website=website, fileName=backupName, date=time.strftime("%m.%d.%Y_%H-%M-%S"), size=0, status=1) newBackup.save() logging.CyberCPLogFileWriter.statusWriter(status, 'Meta data is ready..') - return 1,'None', metaPath + return 1, 'None', metaPath except BaseException as msg: logging.CyberCPLogFileWriter.statusWriter(status, "%s [207][5009]" % (str(msg))) - return 0,str(msg) + return 0, str(msg) @staticmethod - def startBackup(tempStoragePath, backupName, backupPath, metaPath = None): + def startBackup(tempStoragePath, backupName, backupPath, metaPath=None): try: ## /home/example.com/backup/backup-example.com-02.13.2018_10-24-52 -- tempStoragePath @@ -327,12 +326,12 @@ class backupUtilities: writeToFile.writelines(str(os.getpid())) writeToFile.close() - backupFileNamePath = os.path.join(backupPath,"backupFileName") + backupFileNamePath = os.path.join(backupPath, "backupFileName") logging.CyberCPLogFileWriter.statusWriter(backupFileNamePath, backupName) ##### - status = os.path.join(backupPath,'status') + status = os.path.join(backupPath, 'status') logging.CyberCPLogFileWriter.statusWriter(status, "Making archive of home directory.\n") @@ -340,7 +339,7 @@ class backupUtilities: ## /home/example.com/backup/backup-example.com-02.13.2018_10-24-52 -- tempStoragePath - metaPathInBackup = os.path.join(tempStoragePath,'meta.xml') + metaPathInBackup = os.path.join(tempStoragePath, 'meta.xml') if metaPath != None: writeToFile = open(metaPathInBackup, 'w') @@ -349,7 +348,6 @@ class backupUtilities: backupMetaData = ElementTree.parse(metaPathInBackup) - ##### Making archive of home directory domainName = backupMetaData.find('masterDomain').text @@ -366,10 +364,9 @@ class backupUtilities: ## Stop making archive of document_root and copy instead - copy_tree('/home/%s/public_html' % domainName, '%s/%s' % (tempStoragePath, 'public_html')) - #make_archive(os.path.join(tempStoragePath,"public_html"), 'gztar', os.path.join("/home",domainName,"public_html")) + # make_archive(os.path.join(tempStoragePath,"public_html"), 'gztar', os.path.join("/home",domainName,"public_html")) ## @@ -378,7 +375,7 @@ class backupUtilities: except BaseException as msg: try: - os.remove(os.path.join(backupPath,backupName+".tar.gz")) + os.remove(os.path.join(backupPath, backupName + ".tar.gz")) except: pass @@ -388,8 +385,8 @@ class backupUtilities: pass status = os.path.join(backupPath, 'status') - logging.CyberCPLogFileWriter.statusWriter(status, "Aborted, "+ str(msg) + ".[365] [5009]") - print(("Aborted, "+ str(msg) + ".[365] [5009]")) + logging.CyberCPLogFileWriter.statusWriter(status, "Aborted, " + str(msg) + ".[365] [5009]") + print(("Aborted, " + str(msg) + ".[365] [5009]")) os.remove(pidFile) @@ -462,7 +459,8 @@ class backupUtilities: domainName = backupMetaData.find('masterDomain').text - if os.path.islink(status) or os.path.islink(tempStoragePath or os.path.islink(backupPath)) or os.path.islink(metaPath): + if os.path.islink(status) or os.path.islink(tempStoragePath or os.path.islink(backupPath)) or os.path.islink( + metaPath): logging.CyberCPLogFileWriter.writeToFile('symlinked.') logging.CyberCPLogFileWriter.statusWriter(status, 'Symlink attack. [365][5009]') return 0 @@ -482,7 +480,7 @@ class backupUtilities: rmtree(tempStoragePath) ### - backupFileNamePath = os.path.join(backupPath,"backupFileName") + backupFileNamePath = os.path.join(backupPath, "backupFileName") fileName = open(backupFileNamePath, 'r').read() backupObs = Backups.objects.filter(fileName=fileName) @@ -492,27 +490,27 @@ class backupUtilities: for items in backupObs: items.status = 1 items.size = str(int(float( - os.path.getsize(os.path.join(backupPath,backupName+".tar.gz"))) / ( - 1024.0 * 1024.0))) + "MB" + os.path.getsize(os.path.join(backupPath, backupName + ".tar.gz"))) / ( + 1024.0 * 1024.0))) + "MB" items.save() except: for items in backupObs: items.status = 1 items.size = str(int(float( - os.path.getsize(os.path.join(backupPath,backupName+".tar.gz"))) / ( - 1024.0 * 1024.0))) + "MB" + os.path.getsize(os.path.join(backupPath, backupName + ".tar.gz"))) / ( + 1024.0 * 1024.0))) + "MB" items.save() - command = 'chmod 600 %s' % (os.path.join(backupPath,backupName+".tar.gz")) + command = 'chmod 600 %s' % (os.path.join(backupPath, backupName + ".tar.gz")) ProcessUtilities.executioner(command) logging.CyberCPLogFileWriter.statusWriter(status, "Completed\n") os.remove(pidFile) @staticmethod - def initiateBackup(tempStoragePath,backupName,backupPath): + def initiateBackup(tempStoragePath, backupName, backupPath): try: - p = Process(target=backupUtilities.startBackup, args=(tempStoragePath,backupName,backupPath,)) + p = Process(target=backupUtilities.startBackup, args=(tempStoragePath, backupName, backupPath,)) p.start() pid = open(backupPath + 'pid', "w") pid.write(str(p.pid)) @@ -581,14 +579,11 @@ class backupUtilities: if Websites.objects.filter(domain=domain).count() > 0: raise BaseException('This website already exists.') - if ChildDomains.objects.filter(domain=domain).count() > 0: raise BaseException("This website already exists as child domain.") - ####### Pre-creation checks ends - ## Create Configurations result = virtualHostUtilities.createVirtualHost(domain, siteUser.email, phpSelection, externalApp, 0, 1, 0, @@ -623,7 +618,6 @@ class backupUtilities: zone = DNS.getZoneObject(domain) for dnsrecord in dnsrecords: - recordType = dnsrecord.find('type').text value = dnsrecord.find('name').text content = dnsrecord.find('content').text @@ -631,8 +625,7 @@ class backupUtilities: DNS.createDNSRecord(zone, value, recordType, content, prio, 3600) - - return 1,'None' + return 1, 'None' except BaseException as msg: return 0, str(msg) @@ -643,28 +636,28 @@ class backupUtilities: if dir == "CyberPanelRestore": backupFileName = backupName.strip(".tar.gz") - completPath = os.path.join("/home","backup",backupFileName) ## without extension - originalFile = os.path.join("/home","backup",backupName) ## with extension + completPath = os.path.join("/home", "backup", backupFileName) ## without extension + originalFile = os.path.join("/home", "backup", backupName) ## with extension elif dir == 'CLI': completPath = backupName.strip(".tar.gz") ## without extension originalFile = backupName ## with extension else: backupFileName = backupName.strip(".tar.gz") - completPath = "/home/backup/transfer-"+str(dir)+"/"+backupFileName ## without extension - originalFile = "/home/backup/transfer-"+str(dir)+"/"+backupName ## with extension + completPath = "/home/backup/transfer-" + str(dir) + "/" + backupFileName ## without extension + originalFile = "/home/backup/transfer-" + str(dir) + "/" + backupName ## with extension - pathToCompressedHome = os.path.join(completPath,"public_html.tar.gz") + pathToCompressedHome = os.path.join(completPath, "public_html.tar.gz") if not os.path.exists(completPath): os.mkdir(completPath) ## Writing pid of restore process - pid = os.path.join(completPath,'pid') + pid = os.path.join(completPath, 'pid') logging.CyberCPLogFileWriter.statusWriter(pid, str(os.getpid())) - status = os.path.join(completPath,'status') + status = os.path.join(completPath, 'status') logging.CyberCPLogFileWriter.statusWriter(status, "Extracting Main Archive!") ## Converting /home/backup/backup-example.com-02.13.2018_10-24-52.tar.gz -> /home/backup/backup-example.com-02.13.2018_10-24-52 @@ -681,7 +674,6 @@ class backupUtilities: backupMetaData = ElementTree.parse(os.path.join(completPath, "meta.xml")) masterDomain = backupMetaData.find('masterDomain').text - twoPointO = 0 try: version = backupMetaData.find('VERSION').text @@ -713,10 +705,10 @@ class backupUtilities: logging.CyberCPLogFileWriter.writeToFile('%s. [555:startRestore]' % (str(msg))) else: - logging.CyberCPLogFileWriter.statusWriter(status, "Error Message: " + result[1] + ". Not able to create Account, Databases and DNS Records, aborting. [575][5009]") + logging.CyberCPLogFileWriter.statusWriter(status, "Error Message: " + result[ + 1] + ". Not able to create Account, Databases and DNS Records, aborting. [575][5009]") return 0 - ########### Creating child/sub/addon/parked domains logging.CyberCPLogFileWriter.statusWriter(status, "Creating Child Domains!") @@ -724,7 +716,7 @@ class backupUtilities: ## Reading meta file to create subdomains externalApp = backupMetaData.find('externalApp').text - websiteHome = os.path.join("/home",masterDomain,"public_html") + websiteHome = os.path.join("/home", masterDomain, "public_html") ### Restoring Child Domains if any. @@ -747,7 +739,8 @@ class backupUtilities: phpSelection = childDomain.find('phpSelection').text path = childDomain.find('path').text - retValues = virtualHostUtilities.createDomain(masterDomain, domain, phpSelection, path, 0, 0, 0, 'admin', 0) + retValues = virtualHostUtilities.createDomain(masterDomain, domain, phpSelection, path, 0, 0, 0, + 'admin', 0) if retValues[0] == 1: if os.path.exists(websiteHome): @@ -780,7 +773,8 @@ class backupUtilities: except: pass except: - logging.CyberCPLogFileWriter.writeToFile('While restoring backup we had minor issues for rebuilding vhost conf for: ' + domain + '. However this will be auto healed.') + logging.CyberCPLogFileWriter.writeToFile( + 'While restoring backup we had minor issues for rebuilding vhost conf for: ' + domain + '. However this will be auto healed.') if float(version) > 2.0 or float(build) > 0: if path.find('/home/%s/public_html' % masterDomain) == -1: @@ -789,11 +783,12 @@ class backupUtilities: continue else: logging.CyberCPLogFileWriter.writeToFile('Error domain %s' % (domain)) - logging.CyberCPLogFileWriter.statusWriter(status, "Error Message: " + retValues[1] + ". Not able to create child domains, aborting. [635][5009]") + logging.CyberCPLogFileWriter.statusWriter(status, "Error Message: " + retValues[ + 1] + ". Not able to create child domains, aborting. [635][5009]") return 0 except BaseException as msg: - status = open(os.path.join(completPath,'status'), "w") - status.write("Error Message: " + str(msg) +". Not able to create child domains, aborting. [638][5009]") + status = open(os.path.join(completPath, 'status'), "w") + status.write("Error Message: " + str(msg) + ". Not able to create child domains, aborting. [638][5009]") status.close() logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startRestore]") return 0 @@ -824,7 +819,8 @@ class backupUtilities: if result[0] == 0: raise BaseException(result[1]) except BaseException as msg: - logging.CyberCPLogFileWriter.statusWriter(status, "Error Message: " + str(msg) +". Not able to create email accounts, aborting. [671][5009]") + logging.CyberCPLogFileWriter.statusWriter(status, "Error Message: " + str( + msg) + ". Not able to create email accounts, aborting. [671][5009]") logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startRestore]") return 0 @@ -865,7 +861,7 @@ class backupUtilities: try: pathToCompressedEmails = os.path.join(completPath, masterDomain + ".tar.gz") - emailHome = os.path.join("/home","vmail",masterDomain) + emailHome = os.path.join("/home", "vmail", masterDomain) tar = tarfile.open(pathToCompressedEmails) tar.extractall(emailHome) @@ -912,7 +908,7 @@ class backupUtilities: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startRestore]") @staticmethod - def initiateRestore(backupName,dir): + def initiateRestore(backupName, dir): try: p = Process(target=backupUtilities.startRestore, args=(backupName, dir,)) p.start() @@ -920,7 +916,7 @@ class backupUtilities: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [initiateRestore]") @staticmethod - def sendKey(IPAddress, password,port): + def sendKey(IPAddress, password, port='22', user='root'): try: expectation = [] @@ -929,7 +925,7 @@ class backupUtilities: expectation.append("Permission denied") expectation.append("100%") - command = "scp -o StrictHostKeyChecking=no -P "+ port +" /root/.ssh/cyberpanel.pub root@" + IPAddress + ":/root/.ssh/authorized_keys" + command = "scp -o StrictHostKeyChecking=no -P " + port + " /root/.ssh/cyberpanel.pub " + user + "@" + IPAddress + ":~/.ssh/authorized_keys" setupKeys = pexpect.spawn(command, timeout=3) index = setupKeys.expect(expectation) @@ -958,13 +954,13 @@ class backupUtilities: return [0, "TIMEOUT [sendKey]"] except pexpect.EOF as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [sendKey]") - return [0, "EOF [sendKey]"] + return [0, "EOF [sendKey]"] except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [sendKey]") return [0, str(msg) + " [sendKey]"] @staticmethod - def setupSSHKeys(IPAddress, password,port): + def setupSSHKeys(IPAddress, password, port='22', user='root'): try: ## Checking for host verification @@ -974,7 +970,7 @@ class backupUtilities: pass else: logging.CyberCPLogFileWriter.writeToFile("Host is Down.") - #return [0,"Host is Down."] + # return [0,"Host is Down."] expectation = [] expectation.append("password:") @@ -982,7 +978,7 @@ class backupUtilities: expectation.append("Permission denied") expectation.append("File exists") - command = "ssh -o StrictHostKeyChecking=no -p "+ port +" root@"+IPAddress+' "mkdir /root/.ssh || rm -f /root/.ssh/temp && rm -f /root/.ssh/authorized_temp && cp /root/.ssh/authorized_keys /root/.ssh/temp"' + command = "ssh -o StrictHostKeyChecking=no -p " + port + user + "@" + IPAddress + ' "mkdir ~/.ssh || rm -f ~/.ssh/temp && rm -f ~/.ssh/authorized_temp && cp ~/.ssh/authorized_keys ~/.ssh/temp"' setupKeys = pexpect.spawn(command, timeout=3) index = setupKeys.expect(expectation) @@ -1010,18 +1006,18 @@ class backupUtilities: index = setupKeys.expect(expectation) if index == 0: - return [0,"Wrong Password!"] + return [0, "Wrong Password!"] elif index == 1: return [0, "Wrong Password!"] elif index == 2: setupKeys.wait() - sendKey = backupUtilities.sendKey(IPAddress, password, port) + sendKey = backupUtilities.sendKey(IPAddress, password, port, user) if sendKey[0] == 1: return [1, "None"] else: - return [0,sendKey[1]] + return [0, sendKey[1]] except pexpect.TIMEOUT as msg: @@ -1040,7 +1036,7 @@ class backupUtilities: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[checkIfHostIsUp]") @staticmethod - def checkConnection(IPAddress): + def checkConnection(IPAddress, password, port='22', user='root'): try: try: @@ -1057,13 +1053,16 @@ class backupUtilities: expectation.append(pexpect.EOF) expectation.append(pexpect.TIMEOUT) - checkConn = pexpect.spawn("sudo ssh -i /root/.ssh/cyberpanel -o StrictHostKeyChecking=no -p "+ port+" root@"+IPAddress, timeout=3) + checkConn = pexpect.spawn( + "sudo ssh -i /root/.ssh/cyberpanel -o StrictHostKeyChecking=no -p " + port + user + "@" + IPAddress, + timeout=3) index = checkConn.expect(expectation) if index == 0: subprocess.call(['kill', str(checkConn.pid)]) - logging.CyberCPLogFileWriter.writeToFile("Remote Server is not able to authenticate for transfer to initiate, IP Address:" + IPAddress) - return [0,"Remote Server is not able to authenticate for transfer to initiate."] + logging.CyberCPLogFileWriter.writeToFile( + "Remote Server is not able to authenticate for transfer to initiate, IP Address:" + IPAddress) + return [0, "Remote Server is not able to authenticate for transfer to initiate."] elif index == 1: subprocess.call(['kill', str(checkConn.pid)]) logging.CyberCPLogFileWriter.writeToFile( @@ -1080,13 +1079,13 @@ class backupUtilities: return [1, "None"] except pexpect.TIMEOUT as msg: - logging.CyberCPLogFileWriter.writeToFile("Timeout "+IPAddress+ " [checkConnection]") + logging.CyberCPLogFileWriter.writeToFile("Timeout " + IPAddress + " [checkConnection]") return [0, "371 Timeout while making connection to this server [checkConnection]"] except pexpect.EOF as msg: - logging.CyberCPLogFileWriter.writeToFile("EOF "+IPAddress+ "[checkConnection]") + logging.CyberCPLogFileWriter.writeToFile("EOF " + IPAddress + "[checkConnection]") return [0, "374 Remote Server is not able to authenticate for transfer to initiate. [checkConnection]"] except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)+" " +IPAddress+ " [checkConnection]") + logging.CyberCPLogFileWriter.writeToFile(str(msg) + " " + IPAddress + " [checkConnection]") return [0, "377 Remote Server is not able to authenticate for transfer to initiate. [checkConnection]"] @staticmethod @@ -1094,7 +1093,7 @@ class backupUtilities: try: backupUtilities.host_key_verification(IPAddress) - password = "hello" ## dumb password, not used anywhere. + password = "hello" ## dumb password, not used anywhere. expectation = [] @@ -1116,7 +1115,6 @@ class backupUtilities: expectation.append("password:") expectation.append(pexpect.EOF) - innerIndex = setupSSHKeys.expect(expectation) if innerIndex == 0: @@ -1148,25 +1146,25 @@ class backupUtilities: except pexpect.TIMEOUT as msg: logging.CyberCPLogFileWriter.writeToFile("Timeout [verifyHostKey]") - return [0,"Timeout [verifyHostKey]"] + return [0, "Timeout [verifyHostKey]"] except pexpect.EOF as msg: logging.CyberCPLogFileWriter.writeToFile("EOF [verifyHostKey]") - return [0,"EOF [verifyHostKey]"] + return [0, "EOF [verifyHostKey]"] except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [verifyHostKey]") - return [0,str(msg)+" [verifyHostKey]"] + return [0, str(msg) + " [verifyHostKey]"] @staticmethod - def createBackupDir(IPAddress,port): + def createBackupDir(IPAddress, port='22', user='root'): try: - command = "sudo ssh -o StrictHostKeyChecking=no -p "+ port +" -i /root/.ssh/cyberpanel root@"+IPAddress+" mkdir /home/backup" + command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + " mkdir /home/backup" subprocess.call(shlex.split(command)) - command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel root@" + IPAddress + ' "cat /root/.ssh/authorized_keys /root/.ssh/temp > /root/.ssh/authorized_temp"' + command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + ' "cat ~/.ssh/authorized_keys ~/.ssh/temp > ~/.ssh/authorized_temp"' subprocess.call(shlex.split(command)) - command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel root@" + IPAddress + ' "cat /root/.ssh/authorized_temp > /root/.ssh/authorized_keys"' + command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + ' "cat ~/.ssh/authorized_temp > ~/.ssh/authorized_keys"' subprocess.call(shlex.split(command)) except BaseException as msg: @@ -1271,10 +1269,8 @@ def submitBackupCreation(tempStoragePath, backupName, backupPath, backupDomain): writeToFile.close() return 0 - result = backupUtilities.prepareBackupMeta(backupDomain, backupName, tempStoragePath, backupPath) - if result[0] == 0: writeToFile = open(schedulerPath, 'w') writeToFile.writelines('error') @@ -1287,7 +1283,8 @@ def submitBackupCreation(tempStoragePath, backupName, backupPath, backupDomain): execPath = "sudo nice -n 10 /usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" execPath = execPath + " startBackup --tempStoragePath " + tempStoragePath + " --backupName " \ - + backupName + " --backupPath " + backupPath + ' --backupDomain ' + backupDomain + ' --metaPath %s' % (result[2]) + + backupName + " --backupPath " + backupPath + ' --backupDomain ' + backupDomain + ' --metaPath %s' % ( + result[2]) output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) if output.find('[5009') > -1: @@ -1324,7 +1321,7 @@ def submitBackupCreation(tempStoragePath, backupName, backupPath, backupDomain): execPath = "sudo nice -n 10 /usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" execPath = execPath + " BackupRoot --tempStoragePath " + tempStoragePath + " --backupName " \ + backupName + " --backupPath " + backupPath + ' --backupDomain ' + backupDomain + ' --metaPath %s' % ( - result[2]) + result[2]) ProcessUtilities.executioner(execPath, 'root') else: @@ -1340,7 +1337,8 @@ def submitBackupCreation(tempStoragePath, backupName, backupPath, backupDomain): logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [submitBackupCreation]") -def cancelBackupCreation(backupCancellationDomain,fileName): + +def cancelBackupCreation(backupCancellationDomain, fileName): try: path = "/home/" + backupCancellationDomain + "/backup/pid" @@ -1372,9 +1370,10 @@ def cancelBackupCreation(backupCancellationDomain,fileName): except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [cancelBackupCreation]") - print("0,"+str(msg)) + print("0," + str(msg)) -def submitRestore(backupFile,dir): + +def submitRestore(backupFile, dir): try: p = Process(target=backupUtilities.startRestore, args=(backupFile, dir,)) @@ -1385,13 +1384,14 @@ def submitRestore(backupFile,dir): except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [cancelBackupCreation]") - print("0,"+str(msg)) + print("0," + str(msg)) -def submitDestinationCreation(ipAddress, password, port): - setupKeys = backupUtilities.setupSSHKeys(ipAddress, password, port) + +def submitDestinationCreation(ipAddress, password, port='22', user='root'): + setupKeys = backupUtilities.setupSSHKeys(ipAddress, password, port, user) if setupKeys[0] == 1: - backupUtilities.createBackupDir(ipAddress, port) + backupUtilities.createBackupDir(ipAddress, port, user) print("1,None") else: print(setupKeys[1]) @@ -1409,8 +1409,8 @@ def getConnectionStatus(ipAddress): except BaseException as msg: print(str(msg)) -def main(): +def main(): parser = argparse.ArgumentParser(description='CyberPanel Installer') parser.add_argument('function', help='Specific a function to call!') parser.add_argument('--tempStoragePath', help='') @@ -1424,6 +1424,7 @@ def main(): parser.add_argument('--ipAddress', help='') parser.add_argument('--password', help='') parser.add_argument('--port', help='') + parser.add_argument('--user', help='') ## backup cancellation arguments @@ -1435,19 +1436,16 @@ def main(): parser.add_argument('--backupFile', help='') parser.add_argument('--dir', help='') - - - args = parser.parse_args() if args.function == "submitBackupCreation": - submitBackupCreation(args.tempStoragePath,args.backupName,args.backupPath, args.backupDomain) + submitBackupCreation(args.tempStoragePath, args.backupName, args.backupPath, args.backupDomain) elif args.function == "cancelBackupCreation": - cancelBackupCreation(args.backupCancellationDomain,args.fileName) + cancelBackupCreation(args.backupCancellationDomain, args.fileName) elif args.function == "submitRestore": - submitRestore(args.backupFile,args.dir) + submitRestore(args.backupFile, args.dir) elif args.function == "submitDestinationCreation": - submitDestinationCreation(args.ipAddress, args.password, args.port) + submitDestinationCreation(args.ipAddress, args.password, args.port, args.user) elif args.function == "getConnectionStatus": getConnectionStatus(args.ipAddress) elif args.function == "startBackup": @@ -1455,5 +1453,6 @@ def main(): elif args.function == "BackupRoot": backupUtilities.BackupRoot(args.tempStoragePath, args.backupName, args.backupPath, args.metaPath) + if __name__ == "__main__": - main() \ No newline at end of file + main() From 564f53309da14111619501eb43c6bc3f6e0bd91d Mon Sep 17 00:00:00 2001 From: Michael Ramsey Date: Sat, 25 Apr 2020 03:02:53 -0400 Subject: [PATCH 07/23] Fix user html. add user variable to backup.js --- backup/static/backup/backup.js | 3 ++- backup/templates/backup/backupDestinations.html | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backup/static/backup/backup.js b/backup/static/backup/backup.js index 9c158422b..a41fffb41 100755 --- a/backup/static/backup/backup.js +++ b/backup/static/backup/backup.js @@ -416,7 +416,7 @@ app.controller('restoreWebsiteControl', function ($scope, $http, $timeout) { }); -//*** Resotre site ends here ***/// +//*** Restore site ends here ***/// ///** Backup Destination ***// @@ -448,6 +448,7 @@ app.controller('backupDestinations', function ($scope, $http, $timeout) { var data = { IPAddress: $scope.IPAddress, password: $scope.password, + user: $scope.user, backupSSHPort: $scope.backupSSHPort, }; diff --git a/backup/templates/backup/backupDestinations.html b/backup/templates/backup/backupDestinations.html index 689550ccf..9667803ed 100755 --- a/backup/templates/backup/backupDestinations.html +++ b/backup/templates/backup/backupDestinations.html @@ -51,7 +51,7 @@
- +
From 1ab847f28dae78de1e1de5ace5cff4aa4b1b8029 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 25 Apr 2020 12:43:54 +0500 Subject: [PATCH 08/23] bug fix: file download --- filemanager/static/filemanager/js/fileManager.js | 1 - filemanager/views.py | 4 +++- plogical/test.py | 3 --- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/filemanager/static/filemanager/js/fileManager.js b/filemanager/static/filemanager/js/fileManager.js index 725224dbb..19e175118 100755 --- a/filemanager/static/filemanager/js/fileManager.js +++ b/filemanager/static/filemanager/js/fileManager.js @@ -1479,7 +1479,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, // Download files $scope.downloadFile = function () { - url = "/filemanager/downloadFile"; var downloadURL = $scope.currentPath + "/" + allFilesAndFolders[0]; window.location.href = url + '?domainName=' + domainName + '&fileToDownload=' + downloadURL; diff --git a/filemanager/views.py b/filemanager/views.py index d33899d04..6edc740ea 100755 --- a/filemanager/views.py +++ b/filemanager/views.py @@ -66,7 +66,9 @@ def downloadFile(request): admin = Administrator.objects.get(pk=userID) import urllib.parse - fileToDownload = urllib.parse.unquote(request.GET.get('fileToDownload')) + fileToDownload = request.build_absolute_uri().split('fileToDownload')[1][1:] + fileToDownload = urllib.parse.unquote(fileToDownload) + domainName = request.GET.get('domainName') currentACL = ACLManager.loadedACL(userID) diff --git a/plogical/test.py b/plogical/test.py index 8278a4ee9..e69de29bb 100755 --- a/plogical/test.py +++ b/plogical/test.py @@ -1,3 +0,0 @@ -import urllib.parse -encodedStr = 'ville.laprairie.qc.ca&fileToDownload=/home/ville.laprairie.qc.ca/public_html/app/uploads/2019/05/2019-05-16_Terre-contamine%CC%81e-sur-Goyer-150x150.jpg' -print(urllib.parse.unquote(encodedStr)) \ No newline at end of file From 59bbe85eb5918df8e04c5aa1f46f7f63bad1bedd Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 25 Apr 2020 14:17:52 +0500 Subject: [PATCH 09/23] update to cdn url --- install/installCyberPanel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index 4172b674f..a33421611 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -334,10 +334,10 @@ class InstallCyberPanel: command = 'DEBIAN_FRONTEND=noninteractive apt install pure-ftpd-mysql -y' os.system(command) - command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-common_1.0.47-3_all.deb' + command = 'wget https://rep.cyberpanel.net/pure-ftpd-common_1.0.47-3_all.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-mysql_1.0.47-3_amd64.deb' + command = 'wget https://rep.cyberpanel.net/pure-ftpd-mysql_1.0.47-3_amd64.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' From 32598e6865280fd62d5f7509496670ecc73e45af Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 25 Apr 2020 14:18:23 +0500 Subject: [PATCH 10/23] update to cdn url --- install/installCyberPanel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index 5a63e856a..b7b5e2058 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -351,10 +351,10 @@ class InstallCyberPanel: command = 'DEBIAN_FRONTEND=noninteractive apt install pure-ftpd-mysql -y' os.system(command) - command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-common_1.0.47-3_all.deb' + command = 'wget https://rep.cyberpanel.net/pure-ftpd-common_1.0.47-3_all.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - command = 'wget https://ubuntu.cyberpanel.net/pool/main/p/pure-ftpd/pure-ftpd-mysql_1.0.47-3_amd64.deb' + command = 'wget https://rep.cyberpanel.net/pure-ftpd-mysql_1.0.47-3_amd64.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' From 7640db3006ba4fa53dd7507aac2f38aeb4965f32 Mon Sep 17 00:00:00 2001 From: Michael Ramsey Date: Sat, 25 Apr 2020 06:48:08 -0400 Subject: [PATCH 11/23] Fix command spacing --- plogical/backupUtilities.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index 31a299310..9471fbc4b 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -978,7 +978,7 @@ class backupUtilities: expectation.append("Permission denied") expectation.append("File exists") - command = "ssh -o StrictHostKeyChecking=no -p " + port + user + "@" + IPAddress + ' "mkdir ~/.ssh || rm -f ~/.ssh/temp && rm -f ~/.ssh/authorized_temp && cp ~/.ssh/authorized_keys ~/.ssh/temp"' + command = "ssh -o StrictHostKeyChecking=no -p " + port + ' ' + user + "@" + IPAddress + ' "mkdir ~/.ssh || rm -f ~/.ssh/temp && rm -f ~/.ssh/authorized_temp && cp ~/.ssh/authorized_keys ~/.ssh/temp"' setupKeys = pexpect.spawn(command, timeout=3) index = setupKeys.expect(expectation) @@ -1043,6 +1043,7 @@ class backupUtilities: destinations = backupUtilities.destinationsPath data = open(destinations, 'r').readlines() port = data[1].strip("\n") + user = data[2].strip("\n") except: port = "22" @@ -1054,7 +1055,7 @@ class backupUtilities: expectation.append(pexpect.TIMEOUT) checkConn = pexpect.spawn( - "sudo ssh -i /root/.ssh/cyberpanel -o StrictHostKeyChecking=no -p " + port + user + "@" + IPAddress, + "sudo ssh -i /root/.ssh/cyberpanel -o StrictHostKeyChecking=no -p " + port + ' ' + user + "@" + IPAddress, timeout=3) index = checkConn.expect(expectation) @@ -1158,7 +1159,7 @@ class backupUtilities: def createBackupDir(IPAddress, port='22', user='root'): try: - command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + " mkdir /home/backup" + command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + " mkdir ~/backup" subprocess.call(shlex.split(command)) command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + ' "cat ~/.ssh/authorized_keys ~/.ssh/temp > ~/.ssh/authorized_temp"' From a2a0d62ffe6852191b3f8aae5c565e8c18a8c2a8 Mon Sep 17 00:00:00 2001 From: Michael Ramsey Date: Sat, 25 Apr 2020 07:24:26 -0400 Subject: [PATCH 12/23] Fix command spacing --- plogical/backupUtilities.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index 9471fbc4b..886e0f67f 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -1090,7 +1090,7 @@ class backupUtilities: return [0, "377 Remote Server is not able to authenticate for transfer to initiate. [checkConnection]"] @staticmethod - def verifyHostKey(IPAddress): + def verifyHostKey(IPAddress, port='22', user='root'): try: backupUtilities.host_key_verification(IPAddress) @@ -1101,7 +1101,7 @@ class backupUtilities: expectation.append("continue connecting (yes/no)?") expectation.append("password:") - setupSSHKeys = pexpect.spawn("ssh cyberpanel@" + IPAddress, timeout=3) + setupSSHKeys = pexpect.spawn("ssh -p " + port + user + "@" + IPAddress, timeout=3) index = setupSSHKeys.expect(expectation) From b469aa50823f401eeacb42f939db3e5996d67bbf Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 26 Apr 2020 12:15:41 +0500 Subject: [PATCH 13/23] bug fix: cloudlinux fetch users --- CLScript/CloudLinuxUsers.py | 75 +++++++------- CPCent7repo.json | 192 +++++++++++++++++++++++++++++++++++ install/installCyberPanel.py | 2 +- 3 files changed, 232 insertions(+), 37 deletions(-) create mode 100644 CPCent7repo.json diff --git a/CLScript/CloudLinuxUsers.py b/CLScript/CloudLinuxUsers.py index 52c3dd8c9..bdc984655 100755 --- a/CLScript/CloudLinuxUsers.py +++ b/CLScript/CloudLinuxUsers.py @@ -79,48 +79,51 @@ class CloudLinuxUsers(CLMain): def fetchJson(self, websites): users = [] for webs in websites: - itemPackage = webs.package - package = {'name': itemPackage.packageName, 'owner': webs.externalApp} + try: + itemPackage = webs.package + package = {'name': itemPackage.packageName, 'owner': webs.externalApp} - user = {} + user = {} - if self.id: - user['id'] = pwd.getpwnam(webs.externalApp).pw_uid - - if self.un: - user['username'] = webs.externalApp - - if self.ow: - user['owner'] = webs.externalApp - - if self.domain: - user['domain'] = webs.domain - - if self.package: - user['package'] = package - - if self.email: - user['email'] = webs.adminEmail - - if self.localecode: - user['locale_code'] = "EN_us" - - - if self.packageName != None: - if self.package: - if self.packageName == user['package']['name'] and self.packageOwner == user['package']['owner']: - pass - else: - continue - - if self.uid !=None: if self.id: - if self.uid == user['id']: + user['id'] = pwd.getpwnam(webs.externalApp).pw_uid + + if self.un: + user['username'] = webs.externalApp + + if self.ow: + user['owner'] = webs.externalApp + + if self.domain: + user['domain'] = webs.domain + + if self.package: + user['package'] = package + + if self.email: + user['email'] = webs.adminEmail + + if self.localecode: + user['locale_code'] = "EN_us" + + + if self.packageName != None: + if self.package: + if self.packageName == user['package']['name'] and self.packageOwner == user['package']['owner']: + pass + else: + continue + + if self.uid !=None: + if self.id: + if self.uid == user['id']: + users.append(user) + else: users.append(user) else: users.append(user) - else: - users.append(user) + except BaseException as msg: + pass final = {'data': users, 'metadata': self.initialMeta} print(json.dumps(final)) diff --git a/CPCent7repo.json b/CPCent7repo.json new file mode 100644 index 000000000..2e1d80304 --- /dev/null +++ b/CPCent7repo.json @@ -0,0 +1,192 @@ +[ + { + "Package": "MariaDB-client.x86_64", + "Version": "10.1.44-1.el7.centos", + "Repo": "@CyberPanel" + }, + { + "Package": "MariaDB-common.x86_64", + "Version": "10.1.44-1.el7.centos", + "Repo": "@CyberPanel" + }, + { + "Package": "MariaDB-devel.x86_64", + "Version": "10.1.44-1.el7.centos", + "Repo": "@CyberPanel" + }, + { + "Package": "MariaDB-server.x86_64", + "Version": "10.1.44-1.el7.centos", + "Repo": "@CyberPanel" + }, + { + "Package": "MariaDB-shared.x86_64", + "Version": "10.1.44-1.el7.centos", + "Repo": "@CyberPanel" + }, + { + "Package": "compat-libtidy.x86_64", + "Version": "0.99.0-37.20091203.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "dovecot.x86_64", + "Version": "2:2.3.10-2", + "Repo": "@CyberPanel" + }, + { + "Package": "dovecot-mysql.x86_64", + "Version": "2:2.3.10-2", + "Repo": "@CyberPanel" + }, + { + "Package": "fastlz.x86_64", + "Version": "0.1.0-0.1.20070619svnrev12.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "galera.x86_64", + "Version": "25.3.28-1.rhel7.el7.centos", + "Repo": "@CyberPanel" + }, + { + "Package": "htop.x86_64", + "Version": "2.2.0-3.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "jemalloc.x86_64", + "Version": "3.6.0-1.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "libargon2.x86_64", + "Version": "20161029-3.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "libbsd.x86_64", + "Version": "0.8.3-1.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "libc-client.x86_64", + "Version": "2007f-16.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "libdb4.x86_64", + "Version": "4.8.30-13.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "liblzf.x86_64", + "Version": "3.6-7.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "libmcrypt.x86_64", + "Version": "2.5.8-13.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "libopendkim.x86_64", + "Version": "2.11.0-0.1.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "libsodium.x86_64", + "Version": "1.0.18-1.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "libtidy.x86_64", + "Version": "5.4.0-1.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "luajit.x86_64", + "Version": "2.0.4-3.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "oniguruma.x86_64", + "Version": "5.9.5-3.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "opendbx.x86_64", + "Version": "1.4.6-6.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "opendkim.x86_64", + "Version": "2.11.0-0.1.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "pdns.x86_64", + "Version": "4.2.2-1pdns.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "pdns-backend-mysql.x86_64", + "Version": "4.2.2-1pdns.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "postfix3.x86_64", + "Version": "2:3.4.7-1.gf.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "postfix3-ldap.x86_64", + "Version": "2:3.4.7-1.gf.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "postfix3-mysql.x86_64", + "Version": "2:3.4.7-1.gf.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "postfix3-pcre.x86_64", + "Version": "2:3.4.7-1.gf.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "pure-ftpd.x86_64", + "Version": "1.0.47-3.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "redis.x86_64", + "Version": "3.2.12-2.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "restic.x86_64", + "Version": "0.9.6-1.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "rsync31u.x86_64", + "Version": "3.1.3-1.ius.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "udns.x86_64", + "Version": "0.4-3.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "udns-devel.x86_64", + "Version": "0.4-3.el7", + "Repo": "@CyberPanel" + }, + { + "Package": "vim-minimal.x86_64", + "Version": "2:8.0.003-1.gf.el7", + "Repo": "@CyberPanel" + } +] \ No newline at end of file diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index a33421611..c81f38121 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -338,7 +338,7 @@ class InstallCyberPanel: install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) command = 'wget https://rep.cyberpanel.net/pure-ftpd-mysql_1.0.47-3_amd64.deb' - install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) + install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR).org command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) From 68a076dbe05532d473a1fc2de2961c8e029e41dc Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 26 Apr 2020 12:21:51 +0500 Subject: [PATCH 14/23] ubuntu packages list --- AllCPUbuntu.json | 2984 ++++++++++++++++++++++++++++++++++ install/installCyberPanel.py | 2 +- 2 files changed, 2985 insertions(+), 1 deletion(-) create mode 100644 AllCPUbuntu.json diff --git a/AllCPUbuntu.json b/AllCPUbuntu.json new file mode 100644 index 000000000..fe707464f --- /dev/null +++ b/AllCPUbuntu.json @@ -0,0 +1,2984 @@ +[ + { + "Package": "aspell/bionic-updates,bionic-security,now", + "Version": "0.60.7~20110707-4ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "aspell-en/bionic,bionic,now", + "Version": "2017.08.24-0-0.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "autoconf/bionic,bionic,now", + "Version": "2.69-11", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "automake/bionic,bionic,now", + "Version": "1:1.15.1-3ubuntu2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "autopoint/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "0.19.8.1-6ubuntu0.3", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "autotools-dev/bionic,bionic,now", + "Version": "20180224.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "binutils/bionic-updates,bionic-security,now", + "Version": "2.30-21ubuntu1~18.04.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "binutils-common/bionic-updates,bionic-security,now", + "Version": "2.30-21ubuntu1~18.04.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "binutils-x86-64-linux-gnu/bionic-updates,bionic-security,now", + "Version": "2.30-21ubuntu1~18.04.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "build-essential/bionic,now", + "Version": "12.4ubuntu1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "bzip2-doc/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "1.0.6-8.1ubuntu0.2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "comerr-dev/bionic-updates,bionic-security,now", + "Version": "2.1-1.44.1-1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "cpp/bionic-updates,bionic-security,now", + "Version": "4:7.4.0-1ubuntu2.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "cpp-7/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "curl/bionic-updates,bionic-security,now", + "Version": "7.58.0-2ubuntu3.8", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "dbconfig-common/bionic,bionic,now", + "Version": "2.0.9", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "dbconfig-mysql/bionic,bionic,now", + "Version": "2.0.9", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "debhelper/bionic-updates,bionic-updates,now", + "Version": "11.1.6ubuntu2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "dh-autoreconf/bionic,bionic,now", + "Version": "17", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "dh-python/bionic,bionic,now", + "Version": "3.20180325ubuntu2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "dh-strip-nondeterminism/bionic,bionic,now", + "Version": "0.040-1.1~build1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "dns-root-data/bionic,bionic,now", + "Version": "2018013001", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "dovecot-core/bionic,now", + "Version": "2:2.3.10-2+ubuntu18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "dovecot-imapd/bionic,now", + "Version": "2:2.3.10-2+ubuntu18.04", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "dovecot-mysql/bionic,now", + "Version": "2:2.3.10-2+ubuntu18.04", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "dovecot-pop3d/bionic,now", + "Version": "2:2.3.10-2+ubuntu18.04", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "dpkg-dev/bionic-updates,bionic-updates,now", + "Version": "1.19.0.5ubuntu2.3", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "ebtables/bionic-updates,now", + "Version": "2.0.10.4-3.5ubuntu2.18.04.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "enchant/bionic,now", + "Version": "1.6.0-11.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "fakeroot/bionic,now", + "Version": "1.22-2ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "firewalld/bionic,bionic,now", + "Version": "0.4.4.6-1", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "fontconfig/bionic,now", + "Version": "2.12.6-0ubuntu2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "fontconfig-config/bionic,bionic,now", + "Version": "2.12.6-0ubuntu2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "fonts-dejavu-core/bionic,bionic,now", + "Version": "2.37-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "fonts-droid-fallback/bionic,bionic,now", + "Version": "1:6.0.1r16-1.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "fonts-noto-mono/bionic,bionic,now", + "Version": "20171026-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "g++/bionic-updates,bionic-security,now", + "Version": "4:7.4.0-1ubuntu2.3", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "g++-7/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "galera-3/bionic,now", + "Version": "25.3.20-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "gawk/bionic,now", + "Version": "1:4.1.4+dfsg-1build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "gcc/bionic-updates,bionic-security,now", + "Version": "4:7.4.0-1ubuntu2.3", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "gcc-7/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "gcc-7-base/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "geoip-bin/bionic,now", + "Version": "1.6.12-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "gettext/bionic-updates,bionic-security,now", + "Version": "0.19.8.1-6ubuntu0.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "ghostscript/bionic-updates,bionic-security,now", + "Version": "9.26~dfsg+0-0ubuntu0.18.04.12", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "gir1.2-freedesktop/bionic,now", + "Version": "1.56.1-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "gir1.2-gdkpixbuf-2.0/bionic,now", + "Version": "2.36.11-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "gir1.2-harfbuzz-0.0/bionic,now", + "Version": "1.7.2-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "gir1.2-rsvg-2.0/bionic,now", + "Version": "2.40.20-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "git/bionic-updates,bionic-security,now", + "Version": "1:2.17.1-1ubuntu0.7", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "git-man/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "1:2.17.1-1ubuntu0.7", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "gsfonts/bionic,bionic,now", + "Version": "1:8.11+urwcyr1.0.7~pre44-4.4", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "htop/bionic,now", + "Version": "2.1.0-3", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "hunspell-en-us/bionic,bionic,now", + "Version": "1:2017.08.24", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "icu-devtools/bionic-updates,bionic-security,now", + "Version": "60.2-3ubuntu3.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "idn2/bionic-updates,bionic-security,now", + "Version": "2.0.4-1.1ubuntu0.2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "imagemagick-6-common/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "intltool-debian/bionic,bionic,now", + "Version": "0.35.0+20060710.4", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "ipset/bionic,now", + "Version": "6.34-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "javascript-common/bionic,bionic,now", + "Version": "11", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "krb5-multidev/bionic-updates,bionic-security,now", + "Version": "1.16-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libaio1/bionic-updates,now", + "Version": "0.3.110-5ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libalgorithm-diff-perl/bionic,bionic,now", + "Version": "1.19.03-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libalgorithm-diff-xs-perl/bionic,now", + "Version": "0.04-5", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libalgorithm-merge-perl/bionic,bionic,now", + "Version": "0.08-3", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libarchive-cpio-perl/bionic,bionic,now", + "Version": "0.10-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libarchive-zip-perl/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "1.60-1ubuntu0.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libasan4/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libaspell15/bionic-updates,bionic-security,now", + "Version": "0.60.7~20110707-4ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libassuan-dev/bionic,now", + "Version": "2.5.1-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libatomic1/bionic-updates,bionic-security,now", + "Version": "8.4.0-1ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libattr1-dev/bionic,now", + "Version": "1:2.4.47-2build1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libavahi-client3/bionic-updates,bionic-security,now", + "Version": "0.7-3.1ubuntu1.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libavahi-common-data/bionic-updates,bionic-security,now", + "Version": "0.7-3.1ubuntu1.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libavahi-common3/bionic-updates,bionic-security,now", + "Version": "0.7-3.1ubuntu1.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libbinutils/bionic-updates,bionic-security,now", + "Version": "2.30-21ubuntu1~18.04.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libboost-program-options1.65.1/bionic,now", + "Version": "1.65.1+dfsg-0ubuntu5", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libbz2-dev/bionic-updates,bionic-security,now", + "Version": "1.0.6-8.1ubuntu0.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libc-ares2/bionic,now", + "Version": "1.14.0-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libc-client2007e/bionic-updates,bionic-security,now", + "Version": "8:2007f~dfsg-5ubuntu0.18.04.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libc-dev-bin/bionic,now", + "Version": "2.27-3ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libc6-dev/bionic,now", + "Version": "2.27-3ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcairo-gobject2/bionic-updates,now", + "Version": "1.15.10-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcairo-script-interpreter2/bionic-updates,now", + "Version": "1.15.10-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcairo2/bionic-updates,now", + "Version": "1.15.10-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcairo2-dev/bionic-updates,now", + "Version": "1.15.10-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcc1-0/bionic-updates,bionic-security,now", + "Version": "8.4.0-1ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcgi-fast-perl/bionic,bionic,now", + "Version": "1:2.13-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libcgi-pm-perl/bionic,bionic,now", + "Version": "4.38-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libcilkrts5/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcomerr2/bionic-updates,bionic-security,now", + "Version": "1.44.1-1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libconfig-inifiles-perl/bionic,bionic,now", + "Version": "2.94-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libcroco3/bionic,now", + "Version": "0.6.12-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcups2/bionic-updates,bionic-security,now", + "Version": "2.2.7-1ubuntu2.7", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcupsfilters1/bionic-updates,bionic-security,now", + "Version": "1.20.2-0ubuntu3.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcupsimage2/bionic-updates,bionic-security,now", + "Version": "2.2.7-1ubuntu2.7", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcurl3-gnutls/bionic-updates,bionic-security,now", + "Version": "7.58.0-2ubuntu3.8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcurl4/bionic-updates,bionic-security,now", + "Version": "7.58.0-2ubuntu3.8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libcurl4-gnutls-dev/bionic-updates,bionic-security,now", + "Version": "7.58.0-2ubuntu3.8", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libdatrie1/bionic,now", + "Version": "0.2.10-7", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libdbd-mysql-perl/bionic,now", + "Version": "4.046-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libdbi-perl/bionic,now", + "Version": "1.640-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libdjvulibre-dev/bionic-updates,bionic-security,now", + "Version": "3.5.27.1-8ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libdjvulibre-text/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "3.5.27.1-8ubuntu0.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libdjvulibre21/bionic-updates,bionic-security,now", + "Version": "3.5.27.1-8ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libdpkg-perl/bionic-updates,bionic-updates,now", + "Version": "1.19.0.5ubuntu2.3", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libenchant1c2a/bionic,now", + "Version": "1.6.0-11.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libencode-locale-perl/bionic,bionic,now", + "Version": "1.05-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "liberror-perl/bionic,bionic,now", + "Version": "0.17025-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libev4/bionic,now", + "Version": "1:4.22-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libevent-2.1-6/bionic,now", + "Version": "2.1.8-stable-4build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libexif-dev/bionic-updates,bionic-security,now", + "Version": "0.6.21-4ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libexif-doc/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "0.6.21-4ubuntu0.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libexif12/bionic-updates,bionic-security,now", + "Version": "0.6.21-4ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libexpat1-dev/bionic-updates,bionic-security,now", + "Version": "2.2.5-3ubuntu0.2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libexttextcat-2.0-0/bionic,now", + "Version": "3.4.5-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libexttextcat-data/bionic,bionic,now", + "Version": "3.4.5-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libfakeroot/bionic,now", + "Version": "1.22-2ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libfcgi-perl/bionic,now", + "Version": "0.78-2build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libffi-dev/bionic,now", + "Version": "3.2.1-8", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libfftw3-double3/bionic,now", + "Version": "3.3.7-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libfile-copy-recursive-perl/bionic,bionic,now", + "Version": "0.40-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libfile-fcntllock-perl/bionic,now", + "Version": "0.22-3build2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libfile-stripnondeterminism-perl/bionic,bionic,now", + "Version": "0.040-1.1~build1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libfontconfig1/bionic,now", + "Version": "2.12.6-0ubuntu2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libfontconfig1-dev/bionic,now", + "Version": "2.12.6-0ubuntu2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libfreetype6-dev/bionic,now", + "Version": "2.8.1-2ubuntu2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgcc-7-dev/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgcrypt20-dev/bionic-updates,bionic-security,now", + "Version": "1.8.1-4ubuntu1.2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libgdbm-compat4/bionic,now", + "Version": "1.14.1-6", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgdk-pixbuf2.0-0/bionic,now", + "Version": "2.36.11-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgdk-pixbuf2.0-bin/bionic,now", + "Version": "2.36.11-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgdk-pixbuf2.0-common/bionic,bionic,now", + "Version": "2.36.11-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libgdk-pixbuf2.0-dev/bionic,now", + "Version": "2.36.11-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgeoip-dev/bionic,now", + "Version": "1.6.12-1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libglib2.0-bin/bionic-updates,bionic-security,now", + "Version": "2.56.4-0ubuntu0.18.04.6", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libglib2.0-dev/bionic-updates,bionic-security,now", + "Version": "2.56.4-0ubuntu0.18.04.6", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libglib2.0-dev-bin/bionic-updates,bionic-security,now", + "Version": "2.56.4-0ubuntu0.18.04.6", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgmp-dev/bionic,now", + "Version": "2:6.1.2+dfsg-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgmpxx4ldbl/bionic,now", + "Version": "2:6.1.2+dfsg-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgnutls-dane0/bionic-updates,bionic-security,now", + "Version": "3.5.18-1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgnutls-openssl27/bionic-updates,bionic-security,now", + "Version": "3.5.18-1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgnutls28-dev/bionic-updates,bionic-security,now", + "Version": "3.5.18-1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libgnutlsxx28/bionic-updates,bionic-security,now", + "Version": "3.5.18-1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgomp1/bionic-updates,bionic-security,now", + "Version": "8.4.0-1ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgpg-error-dev/bionic,now", + "Version": "1.27-6", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgpgme-dev/bionic-updates,now", + "Version": "1.10.0-1ubuntu2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libgpgme11/bionic-updates,now", + "Version": "1.10.0-1ubuntu2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgpm2/bionic,now", + "Version": "1.20.7-5", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgraphite2-3/bionic,now", + "Version": "1.3.11-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgraphite2-dev/bionic,now", + "Version": "1.3.11-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgs9/bionic-updates,bionic-security,now", + "Version": "9.26~dfsg+0-0ubuntu0.18.04.12", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libgs9-common/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "9.26~dfsg+0-0ubuntu0.18.04.12", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libgssrpc4/bionic-updates,bionic-security,now", + "Version": "1.16-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libharfbuzz-dev/bionic,now", + "Version": "1.7.2-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libharfbuzz-gobject0/bionic,now", + "Version": "1.7.2-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libharfbuzz-icu0/bionic,now", + "Version": "1.7.2-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libharfbuzz0b/bionic,now", + "Version": "1.7.2-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libhtml-parser-perl/bionic,now", + "Version": "3.72-3build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libhtml-tagset-perl/bionic,bionic,now", + "Version": "3.20-3", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libhtml-template-perl/bionic,bionic,now", + "Version": "2.97-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libhttp-date-perl/bionic,bionic,now", + "Version": "6.02-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libhttp-message-perl/bionic,bionic,now", + "Version": "6.14-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libhunspell-1.6-0/bionic,now", + "Version": "1.6.2-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libice-dev/bionic,now", + "Version": "2:1.0.9-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libice6/bionic,now", + "Version": "2:1.0.9-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libicu-dev/bionic-updates,bionic-security,now", + "Version": "60.2-3ubuntu3.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libicu-le-hb-dev/bionic,now", + "Version": "1.0.3+git161113-4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libicu-le-hb0/bionic,now", + "Version": "1.0.3+git161113-4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libiculx60/bionic-updates,bionic-security,now", + "Version": "60.2-3ubuntu3.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libidn2-0-dev/bionic-updates,bionic-security,now", + "Version": "2.0.4-1.1ubuntu0.2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libidn2-dev/bionic-updates,bionic-security,now", + "Version": "2.0.4-1.1ubuntu0.2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libijs-0.35/bionic,now", + "Version": "0.35-13", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libilmbase-dev/bionic,now", + "Version": "2.2.0-11ubuntu2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libilmbase12/bionic,now", + "Version": "2.2.0-11ubuntu2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libio-html-perl/bionic,bionic,now", + "Version": "1.001-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libipset3/bionic,now", + "Version": "6.34-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libisl19/bionic,now", + "Version": "0.19-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libitm1/bionic-updates,bionic-security,now", + "Version": "8.4.0-1ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjansson4/bionic,now", + "Version": "2.11-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjbig-dev/bionic,now", + "Version": "2.1-3.1build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjbig0/bionic,now", + "Version": "2.1-3.1build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjbig2dec0/bionic,now", + "Version": "0.13-6", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjemalloc1/bionic,now", + "Version": "3.6.0-11", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjpeg-dev/bionic,now", + "Version": "8c-2ubuntu8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjpeg-turbo8/bionic-updates,bionic-security,now", + "Version": "1.5.2-0ubuntu5.18.04.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjpeg-turbo8-dev/bionic-updates,bionic-security,now", + "Version": "1.5.2-0ubuntu5.18.04.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjpeg8/bionic,now", + "Version": "8c-2ubuntu8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjpeg8-dev/bionic,now", + "Version": "8c-2ubuntu8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libjs-jquery/bionic,bionic,now", + "Version": "3.2.1-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libkadm5clnt-mit11/bionic-updates,bionic-security,now", + "Version": "1.16-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libkadm5srv-mit11/bionic-updates,bionic-security,now", + "Version": "1.16-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libkdb5-9/bionic-updates,bionic-security,now", + "Version": "1.16-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libkrb5-dev/bionic-updates,bionic-security,now", + "Version": "1.16-2ubuntu0.1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "liblcms2-2/bionic-updates,bionic-security,now", + "Version": "2.9-1ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "liblcms2-dev/bionic-updates,bionic-security,now", + "Version": "2.9-1ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libldap2-dev/bionic-updates,now", + "Version": "2.4.45+dfsg-1ubuntu1.4", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "liblqr-1-0/bionic,now", + "Version": "0.4.2-2.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "liblqr-1-0-dev/bionic,now", + "Version": "0.4.2-2.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "liblsan0/bionic-updates,bionic-security,now", + "Version": "8.4.0-1ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libltdl-dev/bionic,now", + "Version": "2.4.6-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libltdl7/bionic,now", + "Version": "2.4.6-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "liblua5.1-0/bionic,now", + "Version": "5.1.5-8.1build2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "liblua5.2-0/bionic,now", + "Version": "5.2.4-1.1build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "liblua5.3-0/bionic-updates,bionic-security,now", + "Version": "5.3.3-1ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "liblwp-mediatypes-perl/bionic,bionic,now", + "Version": "6.02-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "liblzma-dev/bionic,now", + "Version": "5.2.2-1.3", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "liblzo2-2/bionic,now", + "Version": "2.08-1.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickcore-6-arch-config/bionic-updates,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickcore-6-headers/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickcore-6.q16-3/bionic-updates,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickcore-6.q16-3-extra/bionic-updates,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickcore-6.q16-dev/bionic-updates,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickwand-6-headers/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickwand-6.q16-3/bionic-updates,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickwand-6.q16-dev/bionic-updates,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmagickwand-dev/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "8:6.9.7.4+dfsg-16ubuntu6.8", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "libmail-sendmail-perl/bionic,bionic,now", + "Version": "0.80-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libmariadbclient-dev/bionic-updates,bionic-security,now", + "Version": "1:10.1.44-0ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libmariadbclient18/bionic-updates,bionic-security,now", + "Version": "1:10.1.44-0ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmcrypt4/bionic,now", + "Version": "2.5.8-3.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmemcached11/bionic-updates,now", + "Version": "1.0.18-4.2ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmilter1.0.1/bionic,now", + "Version": "8.15.2-10", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmpc3/bionic,now", + "Version": "1.1.0-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmpfr6/bionic,now", + "Version": "4.0.1-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmpx2/bionic-updates,bionic-security,now", + "Version": "8.4.0-1ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libmysqlclient20/bionic-updates,bionic-security,now", + "Version": "5.7.29-0ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libnghttp2-14/bionic,now", + "Version": "1.30.0-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libnghttp2-dev/bionic,now", + "Version": "1.30.0-1ubuntu1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libonig4/bionic,now", + "Version": "6.7.0-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libopendbx1/bionic,now", + "Version": "1.4.6-11", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libopendbx1-sqlite3/bionic,now", + "Version": "1.4.6-11", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libopendkim11/bionic,now", + "Version": "2.11.0~alpha-11build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libopenexr-dev/bionic-updates,bionic-security,now", + "Version": "2.2.0-11.1ubuntu1.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libopenexr22/bionic-updates,bionic-security,now", + "Version": "2.2.0-11.1ubuntu1.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libp11-kit-dev/bionic,now", + "Version": "0.23.9-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpango-1.0-0/bionic-updates,bionic-security,now", + "Version": "1.40.14-1ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpangocairo-1.0-0/bionic-updates,bionic-security,now", + "Version": "1.40.14-1ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpangoft2-1.0-0/bionic-updates,bionic-security,now", + "Version": "1.40.14-1ubuntu0.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpaper-utils/bionic,now", + "Version": "1.1.24+nmu5ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpaper1/bionic,now", + "Version": "1.1.24+nmu5ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpcre16-3/bionic,now", + "Version": "2:8.39-9", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpcre3-dev/bionic,now", + "Version": "2:8.39-9", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libpcre32-3/bionic,now", + "Version": "2:8.39-9", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpcrecpp0v5/bionic,now", + "Version": "2:8.39-9", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libperl5.26/bionic-updates,bionic-security,now", + "Version": "5.26.1-6ubuntu0.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpixman-1-0/bionic,now", + "Version": "0.34.0-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpixman-1-dev/bionic,now", + "Version": "0.34.0-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpng-dev/bionic-updates,bionic-security,now", + "Version": "1.6.34-1ubuntu0.18.04.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpng-tools/bionic-updates,bionic-security,now", + "Version": "1.6.34-1ubuntu0.18.04.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpolkit-agent-1-0/bionic-updates,bionic-security,now", + "Version": "0.105-20ubuntu0.18.04.5", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpolkit-backend-1-0/bionic-updates,bionic-security,now", + "Version": "0.105-20ubuntu0.18.04.5", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpsl-dev/bionic,now", + "Version": "0.19.1-5build1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libpthread-stubs0-dev/bionic,now", + "Version": "0.3-4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpython3-dev/bionic-updates,now", + "Version": "3.6.7-1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpython3.6/bionic-updates,bionic-security,now", + "Version": "3.6.9-1~18.04ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libpython3.6-dev/bionic-updates,bionic-security,now", + "Version": "3.6.9-1~18.04ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libquadmath0/bionic-updates,bionic-security,now", + "Version": "8.4.0-1ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "librbl1/bionic,now", + "Version": "2.11.0~alpha-11build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libreadline5/bionic,now", + "Version": "5.2+dfsg-3build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "librecode0/bionic,now", + "Version": "3.6-23", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "librsvg2-2/bionic,now", + "Version": "2.40.20-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "librsvg2-common/bionic,now", + "Version": "2.40.20-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "librsvg2-dev/bionic,now", + "Version": "2.40.20-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "librtmp-dev/bionic,now", + "Version": "2.4+20151223.gitfa8646d.1-1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "librtmp1/bionic,now", + "Version": "2.4+20151223.gitfa8646d.1-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libsigsegv2/bionic,now", + "Version": "2.12-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libsm-dev/bionic,now", + "Version": "2:1.2.2-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libsm6/bionic,now", + "Version": "2:1.2.2-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libsodium23/bionic,now", + "Version": "1.0.16-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libssl-dev/bionic-updates,bionic-security,now", + "Version": "1.1.1-1ubuntu2.1~18.04.5", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libstdc++-7-dev/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libstemmer0d/bionic,now", + "Version": "0+svn585-1build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libsys-hostname-long-perl/bionic,bionic,now", + "Version": "1.5-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libtasn1-6-dev/bionic,now", + "Version": "4.13-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libtasn1-doc/bionic,bionic,now", + "Version": "4.13-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libterm-readkey-perl/bionic,now", + "Version": "2.37-1build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libthai-data/bionic,bionic,now", + "Version": "0.1.27-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libthai0/bionic,now", + "Version": "0.1.27-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libtidy5/bionic,now", + "Version": "1:5.2.0-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libtiff-dev/bionic-updates,bionic-security,now", + "Version": "4.0.9-5ubuntu0.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libtiff5/bionic-updates,bionic-security,now", + "Version": "4.0.9-5ubuntu0.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libtiff5-dev/bionic-updates,bionic-security,now", + "Version": "4.0.9-5ubuntu0.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libtiffxx5/bionic-updates,bionic-security,now", + "Version": "4.0.9-5ubuntu0.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libtimedate-perl/bionic,bionic,now", + "Version": "2.3000-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libtool/bionic,bionic,now", + "Version": "2.4.6-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libtsan0/bionic-updates,bionic-security,now", + "Version": "8.4.0-1ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libubsan0/bionic-updates,bionic-security,now", + "Version": "7.5.0-3ubuntu1~18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libudns-dev/bionic,now", + "Version": "0.4-1build1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "libudns0/bionic,now", + "Version": "0.4-1build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libunbound2/bionic-updates,now", + "Version": "1.6.7-1ubuntu2.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "liburi-perl/bionic,bionic,now", + "Version": "1.73-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libvbr2/bionic,now", + "Version": "2.11.0~alpha-11build1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libwebp6/bionic,now", + "Version": "0.6.1-2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libwmf-dev/bionic,now", + "Version": "0.2.8.4-12", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libwmf0.2-7/bionic,now", + "Version": "0.2.8.4-12", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libx11-dev/bionic-updates,now", + "Version": "2:1.6.4-3ubuntu0.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libx11-doc/bionic-updates,bionic-updates,now", + "Version": "2:1.6.4-3ubuntu0.2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "libxau-dev/bionic,now", + "Version": "1:1.0.8-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxcb-render0/bionic-updates,now", + "Version": "1.13-2~ubuntu18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxcb-render0-dev/bionic-updates,now", + "Version": "1.13-2~ubuntu18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxcb-shm0/bionic-updates,now", + "Version": "1.13-2~ubuntu18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxcb-shm0-dev/bionic-updates,now", + "Version": "1.13-2~ubuntu18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxcb1-dev/bionic-updates,now", + "Version": "1.13-2~ubuntu18.04", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxdmcp-dev/bionic,now", + "Version": "1:1.1.2-3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxext-dev/bionic,now", + "Version": "2:1.3.3-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxml2-dev/bionic-updates,bionic-security,now", + "Version": "2.9.4+dfsg1-6.1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxpm4/bionic,now", + "Version": "1:3.5.12-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxrender-dev/bionic,now", + "Version": "1:0.9.10-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxrender1/bionic,now", + "Version": "1:0.9.10-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxslt1.1/bionic-updates,bionic-security,now", + "Version": "1.1.29-5ubuntu0.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxt-dev/bionic,now", + "Version": "1:1.1.5-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libxt6/bionic,now", + "Version": "1:1.1.5-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "libzip4/bionic,now", + "Version": "1.1.2-1.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "linux-libc-dev/bionic-updates,bionic-security,now", + "Version": "4.15.0-96.97", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp70/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-common/bionic,bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "lsphp70-curl/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-dev/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-igbinary/bionic,now", + "Version": "3.0.1-1+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp70-imap/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-intl/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-json/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-ldap/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-memcached/bionic,now", + "Version": "3.1.5-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-msgpack/bionic,now", + "Version": "2.0.3-1+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp70-mysql/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-opcache/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-pspell/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-recode/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-redis/bionic,now", + "Version": "5.1.1-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-sqlite3/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp70-tidy/bionic,now", + "Version": "7.0.33-13+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-common/bionic,bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "lsphp71-curl/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-dev/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-igbinary/bionic,now", + "Version": "3.0.1-1+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp71-imap/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-intl/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-json/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-ldap/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-memcached/bionic,now", + "Version": "3.1.5-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-msgpack/bionic,now", + "Version": "2.0.3-1+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp71-mysql/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-opcache/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-pspell/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-recode/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-redis/bionic,now", + "Version": "5.1.1-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-sqlite3/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp71-tidy/bionic,now", + "Version": "7.1.33-3+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-common/bionic,bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "lsphp72-curl/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-dev/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-igbinary/bionic,now", + "Version": "3.0.1-1+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp72-imap/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-intl/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-json/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-ldap/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-memcached/bionic,now", + "Version": "3.1.5-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-msgpack/bionic,now", + "Version": "2.0.3-1+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp72-mysql/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-opcache/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-pspell/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-recode/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-redis/bionic,now", + "Version": "5.1.1-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-sqlite3/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp72-tidy/bionic,now", + "Version": "7.2.29-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-common/bionic,bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "lsphp73-curl/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-dev/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-igbinary/bionic,now", + "Version": "3.0.1-1+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp73-imap/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-intl/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-json/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-ldap/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-memcached/bionic,now", + "Version": "3.1.5-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-msgpack/bionic,now", + "Version": "2.0.3-1+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp73-mysql/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-opcache/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-pspell/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-recode/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-redis/bionic,now", + "Version": "5.1.1-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-sqlite3/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp73-tidy/bionic,now", + "Version": "7.3.16-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-common/bionic,bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "lsphp74-curl/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-dev/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-igbinary/bionic,now", + "Version": "3.0.1-2+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp74-imap/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-intl/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-json/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-ldap/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-memcached/bionic,now", + "Version": "3.1.5-2+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-msgpack/bionic,now", + "Version": "2.0.3-2+bionic", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "lsphp74-mysql/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-opcache/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-pspell/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-redis/bionic,now", + "Version": "5.1.1-2+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-sqlite3/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "lsphp74-tidy/bionic,now", + "Version": "7.4.4-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "m4/bionic,now", + "Version": "1.4.18-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "make/bionic,now", + "Version": "4.1-9.1ubuntu1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "manpages-dev/bionic,bionic,now", + "Version": "4.15-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "mariadb-client-10.1/bionic-updates,bionic-security,now", + "Version": "1:10.1.44-0ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "mariadb-client-core-10.1/bionic-updates,bionic-security,now", + "Version": "1:10.1.44-0ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "mariadb-common/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "1:10.1.44-0ubuntu0.18.04.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "mariadb-server/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "1:10.1.44-0ubuntu0.18.04.1", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "mariadb-server-10.1/bionic-updates,bionic-security,now", + "Version": "1:10.1.44-0ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "mariadb-server-core-10.1/bionic-updates,bionic-security,now", + "Version": "1:10.1.44-0ubuntu0.18.04.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "memcached/bionic-updates,bionic-security,now", + "Version": "1.5.6-0ubuntu1.2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "mlock/bionic-updates,bionic-security,now", + "Version": "8:2007f~dfsg-5ubuntu0.18.04.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "mysql-common/bionic,bionic,now", + "Version": "5.8+1.0.4", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "nettle-dev/bionic,now", + "Version": "3.4-1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "nghttp2/bionic,bionic,now", + "Version": "1.30.0-1ubuntu1", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "nghttp2-client/bionic,now", + "Version": "1.30.0-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "nghttp2-proxy/bionic,now", + "Version": "1.30.0-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "nghttp2-server/bionic,now", + "Version": "1.30.0-1ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "openbsd-inetd/bionic,now", + "Version": "0.20160825-3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "opendkim/bionic,now", + "Version": "2.11.0~alpha-11build1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "opendkim-tools/bionic,now", + "Version": "2.11.0~alpha-11build1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "openlitespeed/bionic,now", + "Version": "1.6.12-1+bionic", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "patch/bionic-updates,bionic-security,now", + "Version": "2.7.6-2ubuntu1.1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "pdns-backend-bind/bionic,now", + "Version": "4.1.1-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "pdns-backend-mysql/bionic,now", + "Version": "4.1.1-1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "pdns-server/bionic,now", + "Version": "4.1.1-1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "perl/bionic-updates,bionic-security,now", + "Version": "5.26.1-6ubuntu0.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "perl-modules-5.26/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "5.26.1-6ubuntu0.3", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "php-cli/bionic,bionic,now", + "Version": "1:7.2+60ubuntu1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "php-common/bionic,bionic,now", + "Version": "1:60ubuntu1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "php-pear/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "1:1.10.5+submodules+notgz-1ubuntu1.18.04.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "php-readline/bionic,bionic,now", + "Version": "1:7.2+60ubuntu1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "php-xml/bionic,bionic,now", + "Version": "1:7.2+60ubuntu1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "php7.2-cli/bionic-updates,bionic-security,now", + "Version": "7.2.24-0ubuntu0.18.04.4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "php7.2-common/bionic-updates,bionic-security,now", + "Version": "7.2.24-0ubuntu0.18.04.4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "php7.2-json/bionic-updates,bionic-security,now", + "Version": "7.2.24-0ubuntu0.18.04.4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "php7.2-opcache/bionic-updates,bionic-security,now", + "Version": "7.2.24-0ubuntu0.18.04.4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "php7.2-readline/bionic-updates,bionic-security,now", + "Version": "7.2.24-0ubuntu0.18.04.4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "php7.2-xml/bionic-updates,bionic-security,now", + "Version": "7.2.24-0ubuntu0.18.04.4", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "pkg-config/bionic,now", + "Version": "0.29.1-0ubuntu2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "pkg-php-tools/bionic,bionic,now", + "Version": "1.35ubuntu1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "po-debconf/bionic,bionic,now", + "Version": "1.0.20", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "policykit-1/bionic-updates,bionic-security,now", + "Version": "0.105-20ubuntu0.18.04.5", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "poppler-data/bionic,bionic,now", + "Version": "0.4.8-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "postfix/bionic-updates,now", + "Version": "3.3.0-1ubuntu0.2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "postfix-mysql/bionic-updates,now", + "Version": "3.3.0-1ubuntu0.2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "pure-ftpd-common/now", + "Version": "1.0.47-3", + "Arch": "all", + "Status": "[installed,local]" + }, + { + "Package": "pure-ftpd-mysql/now", + "Version": "1.0.47-3", + "Arch": "amd64", + "Status": "[installed,local]" + }, + { + "Package": "python-pip-whl/bionic-updates,bionic-updates,now", + "Version": "9.0.1-2.3~ubuntu1.18.04.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-asn1crypto/bionic,bionic,now", + "Version": "0.24.0-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-cffi-backend/bionic,now", + "Version": "1.11.5-1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-crypto/bionic,now", + "Version": "2.6.1-8ubuntu2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-cryptography/bionic-updates,bionic-security,now", + "Version": "2.1.4-1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-decorator/bionic,bionic,now", + "Version": "4.1.2-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-dev/bionic-updates,now", + "Version": "3.6.7-1~18.04", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "python3-distutils/bionic-updates,bionic-updates,now", + "Version": "3.6.9-1~18.04", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-keyring/bionic,bionic,now", + "Version": "10.6.0-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-keyrings.alt/bionic,bionic,now", + "Version": "3.0-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-lib2to3/bionic-updates,bionic-updates,now", + "Version": "3.6.9-1~18.04", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-pip/bionic-updates,bionic-updates,now", + "Version": "9.0.1-2.3~ubuntu1.18.04.1", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "python3-secretstorage/bionic,bionic,now", + "Version": "2.3.1-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-selinux/bionic,now", + "Version": "2.7-2build2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-setuptools/bionic,bionic,now", + "Version": "39.0.1-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-slip/bionic,bionic,now", + "Version": "0.6.5-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-slip-dbus/bionic,bionic,now", + "Version": "0.6.5-2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-venv/bionic-updates,now", + "Version": "3.6.7-1~18.04", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "python3-virtualenv/bionic,bionic,now", + "Version": "15.1.0+ds-1.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-wheel/bionic,bionic,now", + "Version": "0.30.0-0.2", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3-xdg/bionic,bionic,now", + "Version": "0.25-4ubuntu1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "python3.6-dev/bionic-updates,bionic-security,now", + "Version": "3.6.9-1~18.04ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "python3.6-venv/bionic-updates,bionic-security,now", + "Version": "3.6.9-1~18.04ubuntu1", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "rcs/bionic,now", + "Version": "5.9.4-4", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "redis/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "5:4.0.9-1ubuntu0.2", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "redis-server/bionic-updates,bionic-security,now", + "Version": "5:4.0.9-1ubuntu0.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "redis-tools/bionic-updates,bionic-security,now", + "Version": "5:4.0.9-1ubuntu0.2", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "restic/bionic,now", + "Version": "0.8.3+ds-1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "shtool/bionic,bionic,now", + "Version": "2.0.8-9", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "socat/bionic,now", + "Version": "1.7.3.2-2ubuntu2", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "ssl-cert/bionic,bionic,now", + "Version": "1.0.39", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "tcpd/bionic,now", + "Version": "7.6.q-27", + "Arch": "amd64", + "Status": "[installed,automatic]" + }, + { + "Package": "update-inetd/bionic,bionic,now", + "Version": "4.44", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "vim/bionic-updates,bionic-security,now", + "Version": "2:8.0.1453-1ubuntu1.3", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "vim-runtime/bionic-updates,bionic-updates,bionic-security,bionic-security,now", + "Version": "2:8.0.1453-1ubuntu1.3", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "virtualenv/bionic,bionic,now", + "Version": "15.1.0+ds-1.1", + "Arch": "all", + "Status": "[installed]" + }, + { + "Package": "whichman/bionic,now", + "Version": "2.4-8build1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "x11-common/bionic-updates,bionic-updates,now", + "Version": "1:7.7+19ubuntu7.1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "x11proto-core-dev/bionic,bionic,now", + "Version": "2018.4-4", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "x11proto-dev/bionic,bionic,now", + "Version": "2018.4-4", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "x11proto-xext-dev/bionic,bionic,now", + "Version": "2018.4-4", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "xorg-sgml-doctools/bionic,bionic,now", + "Version": "1:1.11-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "xtrans-dev/bionic,bionic,now", + "Version": "1.3.5-1", + "Arch": "all", + "Status": "[installed,automatic]" + }, + { + "Package": "zip/bionic,now", + "Version": "3.0-11build1", + "Arch": "amd64", + "Status": "[installed]" + }, + { + "Package": "zlib1g-dev/bionic,now", + "Version": "1:1.2.11.dfsg-0ubuntu2", + "Arch": "amd64", + "Status": "[installed]" + } +] \ No newline at end of file diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index c81f38121..a33421611 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -338,7 +338,7 @@ class InstallCyberPanel: install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) command = 'wget https://rep.cyberpanel.net/pure-ftpd-mysql_1.0.47-3_amd64.deb' - install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR).org + install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) From 00e23f430ae153beb530797841de2a7658b96cdd Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 26 Apr 2020 18:42:49 +0500 Subject: [PATCH 15/23] fix imunify after upgrade --- plogical/upgrade.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plogical/upgrade.py b/plogical/upgrade.py index 38d24f8a8..2eeef02bf 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -1375,6 +1375,12 @@ class Upgrade: ## Move static files + imunifyPath = '/usr/local/CyberCP/public/imunify' + + if os.path.exists(imunifyPath): + command = "yum reinstall imunify360-firewall-generic -y" + Upgrade.executioner(command, command, 1) + Upgrade.staticContent() except: From 4e53857425e4272f6a67c709be5428aec910136a Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 26 Apr 2020 23:29:59 +0500 Subject: [PATCH 16/23] fix imunify after upgrade --- plogical/upgrade.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plogical/upgrade.py b/plogical/upgrade.py index 2eeef02bf..427092015 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -1373,14 +1373,6 @@ class Upgrade: Upgrade.stdOut('Settings file restored!') - ## Move static files - - imunifyPath = '/usr/local/CyberCP/public/imunify' - - if os.path.exists(imunifyPath): - command = "yum reinstall imunify360-firewall-generic -y" - Upgrade.executioner(command, command, 1) - Upgrade.staticContent() except: @@ -2113,6 +2105,14 @@ vmail Upgrade.installCLScripts() Upgrade.runSomeImportantBash() + ## Move static files + + imunifyPath = '/usr/local/CyberCP/public/imunify' + + if os.path.exists(imunifyPath): + command = "yum reinstall imunify360-firewall-generic -y" + Upgrade.executioner(command, command, 1) + Upgrade.stdOut("Upgrade Completed.") From 47e93eadbdc3aa6480a27eb8a5651c955c5e15d3 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 26 Apr 2020 23:44:58 +0500 Subject: [PATCH 17/23] remove redundant steps --- cyberpanel_upgrade.sh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/cyberpanel_upgrade.sh b/cyberpanel_upgrade.sh index 89aab1782..d833ba5f6 100644 --- a/cyberpanel_upgrade.sh +++ b/cyberpanel_upgrade.sh @@ -1,4 +1,5 @@ #!/bin/bash + #CyberPanel Upgrade script export LC_CTYPE=en_US.UTF-8 @@ -28,13 +29,6 @@ rm -f /etc/yum.repos.d/gf.repo rm -f /etc/yum.repos.d/powerdns-auth-42.repo rm -rf /etc/yum.repos.d/powerdns-auth-master.repo rm -rf /etc/yum.repos.d/gf.repo.rpmnew -#sed -i 's|enabled=1|enabled=0|g' /etc/yum.repos.d/CentOS-AppStream.repo -yum clean all -yum update -y -yum autoremove epel-release -y -rm -f /etc/yum.repos.d/epel.repo -rm -f /etc/yum.repos.d/epel.repo.rpmsave - ## @@ -171,18 +165,27 @@ if echo $OUTPUT | grep -q "CentOS Linux 7" ; then curl https://raw.githubusercontent.com/usmannasir/cyberpanel/v2.0.1/install/CyberPanel.repo > /etc/yum.repos.d/CyberPanel.repo yum clean all yum update -y + yum autoremove epel-release -y + rm -f /etc/yum.repos.d/epel.repo + rm -f /etc/yum.repos.d/epel.repo.rpmsave elif echo $OUTPUT | grep -q "CloudLinux 7" ; then echo -e "\nDetecting CloudLinux 7.X...\n" SERVER_OS="CentOS7" curl https://raw.githubusercontent.com/usmannasir/cyberpanel/v2.0.1/install/CyberPanel.repo > /etc/yum.repos.d/CyberPanel.repo yum clean all yum update -y + yum autoremove epel-release -y + rm -f /etc/yum.repos.d/epel.repo + rm -f /etc/yum.repos.d/epel.repo.rpmsave elif echo $OUTPUT | grep -q "CentOS Linux 8" ; then curl https://raw.githubusercontent.com/usmannasir/cyberpanel/v2.0.1/install/CyberPanel8.repo > /etc/yum.repos.d/CyberPanel.repo echo -e "\nDetecting CentOS 8.X...\n" SERVER_OS="CentOS8" yum clean all yum update -y + yum autoremove epel-release -y + rm -f /etc/yum.repos.d/epel.repo + rm -f /etc/yum.repos.d/epel.repo.rpmsave elif echo $OUTPUT | grep -q "Ubuntu 18.04" ; then echo -e "\nDetecting Ubuntu 18.04...\n" SERVER_OS="Ubuntu" @@ -285,6 +288,7 @@ else fi check_return + if [ $SERVER_OS = "Ubuntu" ] ; then . /usr/local/CyberCP/bin/activate check_return From 7c241ec0e972557386e4afcc274febc555da9c4d Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 26 Apr 2020 23:52:44 +0500 Subject: [PATCH 18/23] remove redundant steps --- cyberpanel.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/cyberpanel.sh b/cyberpanel.sh index 76d8bb009..993cc279d 100644 --- a/cyberpanel.sh +++ b/cyberpanel.sh @@ -5,7 +5,6 @@ SUDO_TEST=$(set) DEV="OFF" -BRANCH="stable" POSTFIX_VARIABLE="ON" POWERDNS_VARIABLE="ON" PUREFTPD_VARIABLE="ON" From 43eca57ff46417f82a81dbeefead804cbac83a6e Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 27 Apr 2020 11:26:11 +0500 Subject: [PATCH 19/23] bug fix: file permissions during upgrade --- filemanager/filemanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filemanager/filemanager.py b/filemanager/filemanager.py index 6a06c08cc..1b65d29a3 100755 --- a/filemanager/filemanager.py +++ b/filemanager/filemanager.py @@ -385,10 +385,10 @@ class FileManager: domainName = self.data['domainName'] website = Websites.objects.get(domain=domainName) - command = 'chown %s:%s %s' % (website.externalApp, website.externalApp, self.data['completePath'] + '/' + myfile.name) + command = 'chown %s:%s %s' % (website.externalApp, website.externalApp, self.returnPathEnclosed(self.data['completePath'] + '/' + myfile.name)) ProcessUtilities.executioner(command) - self.changeOwner(self.data['completePath'] + '/' + myfile.name) + self.changeOwner(self.returnPathEnclosed(self.data['completePath'] + '/' + myfile.name)) json_data = json.dumps(finalData) return HttpResponse(json_data) From ed0efbf9e04d0fc8d275068b685c7ab05d25a9f4 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 27 Apr 2020 16:18:46 +0500 Subject: [PATCH 20/23] minor fix for custom backup user --- backup/backupManager.py | 51 +++++++++++++------ .../templates/backup/backupDestinations.html | 14 ++--- plogical/backupUtilities.py | 25 +++++++-- 3 files changed, 64 insertions(+), 26 deletions(-) diff --git a/backup/backupManager.py b/backup/backupManager.py index 161a645ad..f7181f4ca 100755 --- a/backup/backupManager.py +++ b/backup/backupManager.py @@ -407,46 +407,65 @@ class BackupManager: destinations = backupUtil.backupUtilities.destinationsPath - ipAddress = data['IPAddress'] - password = data['password'] + finalDic = {} + + finalDic['ipAddress'] = data['IPAddress'] + finalDic['password'] = data['password'] + + try: + finalDic['port'] = data['backupSSHPort'] + except: + finalDic['port'] = "22" + + try: + finalDic['user'] = data['user'] + except: + finalDic['user'] = "root" if dest.objects.all().count() == 2: + final_dic = {'destStatus': 0, 'error_message': "Currently only one remote destination is allowed."} final_json = json.dumps(final_dic) return HttpResponse(final_json) + try: - d = dest.objects.get(destLoc=ipAddress) + d = dest.objects.get(destLoc=finalDic['password']) final_dic = {'destStatus': 0, 'error_message': "This destination already exists."} final_json = json.dumps(final_dic) return HttpResponse(final_json) except: - try: - port = data['backupSSHPort'] - except: - port = "22" - execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " submitDestinationCreation --ipAddress " + ipAddress + " --password " \ - + password + " --port " + port + execPath = execPath + " submitDestinationCreation --ipAddress " + finalDic['ipAddress'] + " --password " \ + + finalDic['password'] + " --port " + finalDic['port'] + ' --user %s' % (finalDic['user']) + + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(execPath) output = ProcessUtilities.outputExecutioner(execPath) + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(output) + + if output.find('1,') > -1: try: writeToFile = open(destinations, "w") - writeToFile.writelines(ipAddress + "\n") - writeToFile.writelines(data['backupSSHPort'] + "\n") + writeToFile.write(json.dumps(finalDic)) writeToFile.close() - newDest = dest(destLoc=ipAddress) + newDest = dest(destLoc=finalDic['ipAddress']) newDest.save() + + final_dic = {'destStatus': 1, 'error_message': "None"} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) except: writeToFile = open(destinations, "w") - writeToFile.writelines(ipAddress + "\n") - writeToFile.writelines("22" + "\n") + writeToFile.write(json.dumps(finalDic)) writeToFile.close() - newDest = dest(destLoc=ipAddress) + + newDest = dest(destLoc=finalDic['ipAddress']) newDest.save() final_dic = {'destStatus': 1, 'error_message': "None"} diff --git a/backup/templates/backup/backupDestinations.html b/backup/templates/backup/backupDestinations.html index 9667803ed..5ab7e5ad9 100755 --- a/backup/templates/backup/backupDestinations.html +++ b/backup/templates/backup/backupDestinations.html @@ -33,6 +33,13 @@
+
+ +
+ +
+
+
@@ -48,13 +55,6 @@
-
- -
- -
-
-
diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index 886e0f67f..a017d410a 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -928,6 +928,9 @@ class backupUtilities: command = "scp -o StrictHostKeyChecking=no -P " + port + " /root/.ssh/cyberpanel.pub " + user + "@" + IPAddress + ":~/.ssh/authorized_keys" setupKeys = pexpect.spawn(command, timeout=3) + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(command) + index = setupKeys.expect(expectation) ## on first login attempt send password @@ -981,6 +984,9 @@ class backupUtilities: command = "ssh -o StrictHostKeyChecking=no -p " + port + ' ' + user + "@" + IPAddress + ' "mkdir ~/.ssh || rm -f ~/.ssh/temp && rm -f ~/.ssh/authorized_temp && cp ~/.ssh/authorized_keys ~/.ssh/temp"' setupKeys = pexpect.spawn(command, timeout=3) + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(command) + index = setupKeys.expect(expectation) ## on first login attempt send password @@ -1040,10 +1046,11 @@ class backupUtilities: try: try: + import json destinations = backupUtilities.destinationsPath - data = open(destinations, 'r').readlines() - port = data[1].strip("\n") - user = data[2].strip("\n") + data = json.loads(open(destinations, 'r').read()) + port = data['port'] + user = data['user'] except: port = "22" @@ -1160,12 +1167,24 @@ class backupUtilities: try: command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + " mkdir ~/backup" + + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(command) + subprocess.call(shlex.split(command)) command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + ' "cat ~/.ssh/authorized_keys ~/.ssh/temp > ~/.ssh/authorized_temp"' + + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(command) + subprocess.call(shlex.split(command)) command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel " + user + "@" + IPAddress + ' "cat ~/.ssh/authorized_temp > ~/.ssh/authorized_keys"' + + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(command) + subprocess.call(shlex.split(command)) except BaseException as msg: From 9bcf437e7d193709f194360e0ad67621b531bc12 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 27 Apr 2020 21:01:28 +0500 Subject: [PATCH 21/23] fix missing password --- plogical/backupSchedule.py | 15 +++++++++------ plogical/backupUtilities.py | 11 +++++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/plogical/backupSchedule.py b/plogical/backupSchedule.py index 48d9a1ef2..0a87c8e04 100755 --- a/plogical/backupSchedule.py +++ b/plogical/backupSchedule.py @@ -219,13 +219,16 @@ class backupSchedule: ## IP of Remote server. - data = open(destinations,'r').readlines() - ipAddress = data[0].strip("\n") - port = data[1].strip("\n") - user = data[2].strip("\n") + destinations = backupUtilities.destinationsPath + data = json.loads(open(destinations, 'r').read()) + port = data['port'] - # Set the user to root if not specified aka empty - user = user if bool(user) is not False else 'root' + try: + user = data['user'] + except: + user = 'root' + + ipAddress = data['ipAddress'] ## IPAddress of local server diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index a017d410a..d936b0c60 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -1042,7 +1042,7 @@ class backupUtilities: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[checkIfHostIsUp]") @staticmethod - def checkConnection(IPAddress, password, port='22', user='root'): + def checkConnection(IPAddress, port='22', user='root'): try: try: @@ -1061,9 +1061,12 @@ class backupUtilities: expectation.append(pexpect.EOF) expectation.append(pexpect.TIMEOUT) - checkConn = pexpect.spawn( - "sudo ssh -i /root/.ssh/cyberpanel -o StrictHostKeyChecking=no -p " + port + ' ' + user + "@" + IPAddress, - timeout=3) + command = "sudo ssh -i /root/.ssh/cyberpanel -o StrictHostKeyChecking=no -p " + port + ' ' + user + "@" + IPAddress + + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(command) + + checkConn = pexpect.spawn(command,timeout=3) index = checkConn.expect(expectation) if index == 0: From 577e1425cf2bc653a9034f63eca2bc0aff5fc9bc Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 28 Apr 2020 04:37:21 +0500 Subject: [PATCH 22/23] bug fix: permissions issue in file manager --- filemanager/filemanager.py | 6 +++--- plogical/remoteTransferUtilities.py | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/filemanager/filemanager.py b/filemanager/filemanager.py index 32b9aad41..5a8b1c2c7 100755 --- a/filemanager/filemanager.py +++ b/filemanager/filemanager.py @@ -386,10 +386,10 @@ class FileManager: domainName = self.data['domainName'] website = Websites.objects.get(domain=domainName) - command = 'chown %s:%s %s' % (website.externalApp, website.externalApp, self.data['completePath'] + '/' + myfile.name) + command = 'chown %s:%s %s' % (website.externalApp, website.externalApp, self.returnPathEnclosed(self.data['completePath'] + '/' + myfile.name)) ProcessUtilities.executioner(command) - self.changeOwner(self.data['completePath'] + '/' + myfile.name) + self.changeOwner(self.returnPathEnclosed(self.data['completePath'] + '/' + myfile.name)) json_data = json.dumps(finalData) return HttpResponse(json_data) @@ -421,7 +421,7 @@ class FileManager: ProcessUtilities.executioner(command, website.externalApp) - self.changeOwner(self.data['extractionLocation']) + self.fixPermissions(domainName) json_data = json.dumps(finalData) return HttpResponse(json_data) diff --git a/plogical/remoteTransferUtilities.py b/plogical/remoteTransferUtilities.py index 5df7b9b91..76a1ef5c0 100755 --- a/plogical/remoteTransferUtilities.py +++ b/plogical/remoteTransferUtilities.py @@ -193,6 +193,9 @@ class remoteTransferUtilities: command = "sudo scp -o StrictHostKeyChecking=no -i /root/.ssh/cyberpanel " + completedPathToSend + " root@" + IPAddress + ":/home/backup/transfer-" + folderNumber + "/" subprocess.call(shlex.split(command), stdout=writeToFile) + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile(command) + os.remove(completedPathToSend) except BaseException as msg: From 6a9c774fcb78f30744af915364673878a36d59ed Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 28 Apr 2020 17:51:31 +0500 Subject: [PATCH 23/23] increase backup file holder name size --- plogical/backupUtilities.py | 20 ++++++++++---------- plogical/upgrade.py | 5 +++++ websiteFunctions/models.py | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index d936b0c60..59f62b16f 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -480,25 +480,25 @@ class backupUtilities: rmtree(tempStoragePath) ### - backupFileNamePath = os.path.join(backupPath, "backupFileName") - fileName = open(backupFileNamePath, 'r').read() - backupObs = Backups.objects.filter(fileName=fileName) + backupObs = Backups.objects.filter(fileName=backupName) ## adding backup data to database. + + filePath = '%s/%s.tar.gz' % (backupPath, backupName) + totalSize = '%sMB' % (str(int(os.path.getsize(filePath) / 1048576))) + try: for items in backupObs: items.status = 1 - items.size = str(int(float( - os.path.getsize(os.path.join(backupPath, backupName + ".tar.gz"))) / ( - 1024.0 * 1024.0))) + "MB" + items.size = totalSize items.save() - except: + logging.CyberCPLogFileWriter.writeToFile(' again size: %s' % (totalSize)) + except BaseException as msg: + logging.CyberCPLogFileWriter.writeToFile('%s. [backupRoot:499]' % str(msg)) for items in backupObs: items.status = 1 - items.size = str(int(float( - os.path.getsize(os.path.join(backupPath, backupName + ".tar.gz"))) / ( - 1024.0 * 1024.0))) + "MB" + items.size = totalSize items.save() command = 'chmod 600 %s' % (os.path.join(backupPath, backupName + ".tar.gz")) diff --git a/plogical/upgrade.py b/plogical/upgrade.py index 427092015..f200bd53b 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -579,6 +579,11 @@ class Upgrade: except: pass + try: + cursor.execute("ALTER TABLE websiteFunctions_backups MODIFY fileName varchar(200)") + except: + pass + try: cursor.execute("ALTER TABLE loginSystem_acl ADD COLUMN listUsers INT DEFAULT 0;") diff --git a/websiteFunctions/models.py b/websiteFunctions/models.py index 9206d125d..93ebc01f1 100755 --- a/websiteFunctions/models.py +++ b/websiteFunctions/models.py @@ -29,7 +29,7 @@ class ChildDomains(models.Model): class Backups(models.Model): website = models.ForeignKey(Websites,on_delete=models.CASCADE) - fileName = models.CharField(max_length=50) + fileName = models.CharField(max_length=200) date = models.CharField(max_length=50) size = models.CharField(max_length=50) status = models.IntegerField(default=0)