diff --git a/CyberCP/__init__.pyc b/CyberCP/__init__.pyc index b4c1a3d74..55097d04c 100644 Binary files a/CyberCP/__init__.pyc and b/CyberCP/__init__.pyc differ diff --git a/CyberCP/settings.py b/CyberCP/settings.py index 4348eed51..a729f925d 100644 --- a/CyberCP/settings.py +++ b/CyberCP/settings.py @@ -102,7 +102,7 @@ DATABASES = { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'cyberpanel', 'USER': 'cyberpanel', - 'PASSWORD': 'jFzZwX3fFyYrCo', + 'PASSWORD': 'YhGk1hGnOcWwJl', 'HOST': '127.0.0.1', 'PORT':'3307' }, @@ -110,7 +110,7 @@ DATABASES = { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysql', 'USER': 'root', - 'PASSWORD': 'b1w3wHi5x0o8t9', + 'PASSWORD': '8oUlBn5AmS8RuY', 'HOST': 'localhost', 'PORT': '', } diff --git a/CyberCP/settings.pyc b/CyberCP/settings.pyc index 25b0de830..1984388f5 100644 Binary files a/CyberCP/settings.pyc and b/CyberCP/settings.pyc differ diff --git a/CyberCP/urls.pyc b/CyberCP/urls.pyc index c0222a041..aa9a4531f 100644 Binary files a/CyberCP/urls.pyc and b/CyberCP/urls.pyc differ diff --git a/CyberCP/wsgi.pyc b/CyberCP/wsgi.pyc index cdb9773d1..059d36bb8 100644 Binary files a/CyberCP/wsgi.pyc and b/CyberCP/wsgi.pyc differ diff --git a/api/__init__.pyc b/api/__init__.pyc index b65fd3706..88a1202ee 100644 Binary files a/api/__init__.pyc and b/api/__init__.pyc differ diff --git a/api/admin.pyc b/api/admin.pyc index 82f1d16fa..f67fa07b6 100644 Binary files a/api/admin.pyc and b/api/admin.pyc differ diff --git a/api/migrations/__init__.pyc b/api/migrations/__init__.pyc index 4c9e20302..06a302d9e 100644 Binary files a/api/migrations/__init__.pyc and b/api/migrations/__init__.pyc differ diff --git a/api/models.pyc b/api/models.pyc index 3561deb50..88786fc50 100644 Binary files a/api/models.pyc and b/api/models.pyc differ diff --git a/api/urls.pyc b/api/urls.pyc index 99cb5e138..4e75d414e 100644 Binary files a/api/urls.pyc and b/api/urls.pyc differ diff --git a/api/views.pyc b/api/views.pyc index bc318f6d6..9682dc7ab 100644 Binary files a/api/views.pyc and b/api/views.pyc differ diff --git a/backup/__init__.pyc b/backup/__init__.pyc index a070efdd6..5e1729ecf 100644 Binary files a/backup/__init__.pyc and b/backup/__init__.pyc differ diff --git a/backup/admin.pyc b/backup/admin.pyc index 18caa545d..03ca0bb13 100644 Binary files a/backup/admin.pyc and b/backup/admin.pyc differ diff --git a/backup/backupRouter.pyc b/backup/backupRouter.pyc index 9e4391e2a..a1c0d6bfd 100644 Binary files a/backup/backupRouter.pyc and b/backup/backupRouter.pyc differ diff --git a/backup/migrations/__init__.pyc b/backup/migrations/__init__.pyc index 668f9ed67..b28194502 100644 Binary files a/backup/migrations/__init__.pyc and b/backup/migrations/__init__.pyc differ diff --git a/backup/models.pyc b/backup/models.pyc index 4b928877f..98d1903fd 100644 Binary files a/backup/models.pyc and b/backup/models.pyc differ diff --git a/backup/urls.pyc b/backup/urls.pyc index fb687ad92..5dfaf0046 100644 Binary files a/backup/urls.pyc and b/backup/urls.pyc differ diff --git a/backup/views.pyc b/backup/views.pyc index 22a7a9aeb..8d6a38078 100644 Binary files a/backup/views.pyc and b/backup/views.pyc differ diff --git a/baseTemplate/__init__.pyc b/baseTemplate/__init__.pyc index 25e5b7d66..41fb6a23f 100644 Binary files a/baseTemplate/__init__.pyc and b/baseTemplate/__init__.pyc differ diff --git a/baseTemplate/admin.pyc b/baseTemplate/admin.pyc index cb9c918b2..3588ec17f 100644 Binary files a/baseTemplate/admin.pyc and b/baseTemplate/admin.pyc differ diff --git a/baseTemplate/migrations/__init__.pyc b/baseTemplate/migrations/__init__.pyc index 1812d5b2c..8cb677806 100644 Binary files a/baseTemplate/migrations/__init__.pyc and b/baseTemplate/migrations/__init__.pyc differ diff --git a/baseTemplate/models.pyc b/baseTemplate/models.pyc index 0b1265b82..c0c962bcf 100644 Binary files a/baseTemplate/models.pyc and b/baseTemplate/models.pyc differ diff --git a/baseTemplate/urls.pyc b/baseTemplate/urls.pyc index bab1aefcd..aa574818c 100644 Binary files a/baseTemplate/urls.pyc and b/baseTemplate/urls.pyc differ diff --git a/baseTemplate/views.pyc b/baseTemplate/views.pyc index 6ec3ff923..44ea4d657 100644 Binary files a/baseTemplate/views.pyc and b/baseTemplate/views.pyc differ diff --git a/databases/__init__.pyc b/databases/__init__.pyc index f8e7593fc..5f3a4aa57 100644 Binary files a/databases/__init__.pyc and b/databases/__init__.pyc differ diff --git a/databases/admin.pyc b/databases/admin.pyc index b3edea730..97e2bf662 100644 Binary files a/databases/admin.pyc and b/databases/admin.pyc differ diff --git a/databases/migrations/__init__.pyc b/databases/migrations/__init__.pyc index 5e851d72e..6a7414d36 100644 Binary files a/databases/migrations/__init__.pyc and b/databases/migrations/__init__.pyc differ diff --git a/databases/models.pyc b/databases/models.pyc index 479ad2eee..9651c0b3e 100644 Binary files a/databases/models.pyc and b/databases/models.pyc differ diff --git a/databases/urls.pyc b/databases/urls.pyc index 93d4c022d..fca876485 100644 Binary files a/databases/urls.pyc and b/databases/urls.pyc differ diff --git a/databases/views.pyc b/databases/views.pyc index bd00aef06..88dc557e9 100644 Binary files a/databases/views.pyc and b/databases/views.pyc differ diff --git a/dns/__init__.pyc b/dns/__init__.pyc index e13d9790c..70a8aa17d 100644 Binary files a/dns/__init__.pyc and b/dns/__init__.pyc differ diff --git a/dns/admin.pyc b/dns/admin.pyc index 590876449..94712e1a7 100644 Binary files a/dns/admin.pyc and b/dns/admin.pyc differ diff --git a/dns/migrations/__init__.pyc b/dns/migrations/__init__.pyc index 698fa1f2c..ef5b5b6b8 100644 Binary files a/dns/migrations/__init__.pyc and b/dns/migrations/__init__.pyc differ diff --git a/dns/models.pyc b/dns/models.pyc index 0c689a527..d1c087e67 100644 Binary files a/dns/models.pyc and b/dns/models.pyc differ diff --git a/dns/urls.pyc b/dns/urls.pyc index e8b2717ab..690341110 100644 Binary files a/dns/urls.pyc and b/dns/urls.pyc differ diff --git a/dns/views.pyc b/dns/views.pyc index 6f54b4c40..9293ad8ed 100644 Binary files a/dns/views.pyc and b/dns/views.pyc differ diff --git a/filemanager/__init__.pyc b/filemanager/__init__.pyc index 6951e53e3..ad89af2ad 100644 Binary files a/filemanager/__init__.pyc and b/filemanager/__init__.pyc differ diff --git a/filemanager/admin.pyc b/filemanager/admin.pyc index df5374762..cb014e28a 100644 Binary files a/filemanager/admin.pyc and b/filemanager/admin.pyc differ diff --git a/filemanager/migrations/__init__.pyc b/filemanager/migrations/__init__.pyc index f891df3cf..1af004c20 100644 Binary files a/filemanager/migrations/__init__.pyc and b/filemanager/migrations/__init__.pyc differ diff --git a/filemanager/models.pyc b/filemanager/models.pyc index 2f5b0f198..20f021a5e 100644 Binary files a/filemanager/models.pyc and b/filemanager/models.pyc differ diff --git a/filemanager/urls.pyc b/filemanager/urls.pyc index f7fd1bd0f..14c72a0a7 100644 Binary files a/filemanager/urls.pyc and b/filemanager/urls.pyc differ diff --git a/filemanager/views.pyc b/filemanager/views.pyc index 1656dddbc..f09143d97 100644 Binary files a/filemanager/views.pyc and b/filemanager/views.pyc differ diff --git a/firewall/__init__.pyc b/firewall/__init__.pyc index b3cebf703..4ce1bde85 100644 Binary files a/firewall/__init__.pyc and b/firewall/__init__.pyc differ diff --git a/firewall/admin.pyc b/firewall/admin.pyc index 4a7e86e1f..606c929e7 100644 Binary files a/firewall/admin.pyc and b/firewall/admin.pyc differ diff --git a/firewall/migrations/__init__.pyc b/firewall/migrations/__init__.pyc index 02e76ca38..0400aa78a 100644 Binary files a/firewall/migrations/__init__.pyc and b/firewall/migrations/__init__.pyc differ diff --git a/firewall/models.pyc b/firewall/models.pyc index 31f9975ea..fb89dba22 100644 Binary files a/firewall/models.pyc and b/firewall/models.pyc differ diff --git a/firewall/urls.pyc b/firewall/urls.pyc index 4af092017..5f83296e8 100644 Binary files a/firewall/urls.pyc and b/firewall/urls.pyc differ diff --git a/firewall/views.pyc b/firewall/views.pyc index 427e075fb..e1d1c9a8d 100644 Binary files a/firewall/views.pyc and b/firewall/views.pyc differ diff --git a/ftp/__init__.pyc b/ftp/__init__.pyc index d4609ae24..3b0307776 100644 Binary files a/ftp/__init__.pyc and b/ftp/__init__.pyc differ diff --git a/ftp/admin.pyc b/ftp/admin.pyc index c33a0295d..2c41f8807 100644 Binary files a/ftp/admin.pyc and b/ftp/admin.pyc differ diff --git a/ftp/migrations/__init__.pyc b/ftp/migrations/__init__.pyc index 482016b39..40ddc74bb 100644 Binary files a/ftp/migrations/__init__.pyc and b/ftp/migrations/__init__.pyc differ diff --git a/ftp/models.pyc b/ftp/models.pyc index 64b88c626..82197fbb3 100644 Binary files a/ftp/models.pyc and b/ftp/models.pyc differ diff --git a/ftp/urls.pyc b/ftp/urls.pyc index f0d1d1a4b..e1ca8ae83 100644 Binary files a/ftp/urls.pyc and b/ftp/urls.pyc differ diff --git a/ftp/views.pyc b/ftp/views.pyc index 017b2b09c..5c64aff9c 100644 Binary files a/ftp/views.pyc and b/ftp/views.pyc differ diff --git a/install/report.sh b/install/report.sh new file mode 100755 index 000000000..822c32c05 --- /dev/null +++ b/install/report.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# +# Please paste the output of this script when asking for installation related support on CyberPanel Forum +# Link: https://forums.cyberpanel.net/ +# + +clear; clear +echo +echo "Starting installation fault script" +echo Data: `date` +echo + +echo "################################" + +if [[ $(command -v wget) ]]; then + echo "Wget is present" +else + echo "Wget not found" +fi + +echo "################################" +echo Total Ram: `free -h | awk 'NR==2 {print $2}'` +echo "Recommended: 1GB" +echo +echo "Disk Space" +df -h --total | tail -n 1 +echo "################################" +echo +if [[ $(hostnamectl status | grep Virtualization) ]]; then +hostnamectl status | grep Virtualization | sed -e 's/^[ \t]*//' +else +echo "No virtualization found" +fi + +# Operating System +echo +# +if [[ $(hostnamectl status | grep "Operating System") ]]; then +hostnamectl status | grep "Operating System" | sed -e 's/^[ \t]*//' +else +echo "Unable to detect operating system" +fi + +# Kernel +echo +# +if [[ $(uname -a) ]]; then +echo Kernel: `uname -a` +else +echo "Unable to detect kernel" +fi +echo +# + +echo "###########################" +echo +if [[ -d /usr/local/CyberCP ]]; then + echo "CyberCP directory found" +else + echo "CyberCP directory not found" +fi +echo +echo "###########################" + +echo "Last 100 lines from installLogs.txt" + +if [[ -f /usr/local/CyberCP/installLogs.txt ]]; then + tail -n 100 /usr/local/CyberCP/installLogs.txt +elif [[ -f install/installLogs.txt ]]; then # Look for log file in cwd/install + tail -n 100 install/installLogs.txt +elif [[ -f /var/log/installLogs.txt ]]; then + tail -n 100 /var/log/installLogs.txt +elif [[ -f /usr/local/installLogs.txt ]]; then + tail -n 100 /usr/local/installLogs.txt +else + echo "Error log file not found" +fi +echo "###########################" +echo +echo "Gunicorn Status:" +if [[ $(systemctl status gunicorn | grep active) ]]; then + echo "Gunicorn seems to be running" +else + echo "Seems like gunicorn isn't running. Printing status" + systemctl status gunicorn +fi + +echo +echo "###########################" diff --git a/loginSystem/__init__.pyc b/loginSystem/__init__.pyc index f65734b59..f34fbcc9a 100644 Binary files a/loginSystem/__init__.pyc and b/loginSystem/__init__.pyc differ diff --git a/loginSystem/admin.pyc b/loginSystem/admin.pyc index f852b0ed2..2fcb94505 100644 Binary files a/loginSystem/admin.pyc and b/loginSystem/admin.pyc differ diff --git a/loginSystem/migrations/0001_initial.pyc b/loginSystem/migrations/0001_initial.pyc index c67ea2944..bcfa14df2 100644 Binary files a/loginSystem/migrations/0001_initial.pyc and b/loginSystem/migrations/0001_initial.pyc differ diff --git a/loginSystem/migrations/__init__.pyc b/loginSystem/migrations/__init__.pyc index b5a1ee709..965fa4ff1 100644 Binary files a/loginSystem/migrations/__init__.pyc and b/loginSystem/migrations/__init__.pyc differ diff --git a/loginSystem/models.pyc b/loginSystem/models.pyc index a0669655b..f993c82fc 100644 Binary files a/loginSystem/models.pyc and b/loginSystem/models.pyc differ diff --git a/loginSystem/urls.pyc b/loginSystem/urls.pyc index 8056e138d..a5ea8b29b 100644 Binary files a/loginSystem/urls.pyc and b/loginSystem/urls.pyc differ diff --git a/loginSystem/views.pyc b/loginSystem/views.pyc index af9461c6d..5ec9c7194 100644 Binary files a/loginSystem/views.pyc and b/loginSystem/views.pyc differ diff --git a/mailServer/__init__.pyc b/mailServer/__init__.pyc index 49c4c226a..3ce350372 100644 Binary files a/mailServer/__init__.pyc and b/mailServer/__init__.pyc differ diff --git a/mailServer/admin.pyc b/mailServer/admin.pyc index 467828123..e2e03cd12 100644 Binary files a/mailServer/admin.pyc and b/mailServer/admin.pyc differ diff --git a/mailServer/migrations/__init__.pyc b/mailServer/migrations/__init__.pyc index f3eb34c36..31aac23e9 100644 Binary files a/mailServer/migrations/__init__.pyc and b/mailServer/migrations/__init__.pyc differ diff --git a/mailServer/models.pyc b/mailServer/models.pyc index 3d8d40b5d..7b775aee1 100644 Binary files a/mailServer/models.pyc and b/mailServer/models.pyc differ diff --git a/mailServer/urls.pyc b/mailServer/urls.pyc index 899cf1cf5..f1d7ad666 100644 Binary files a/mailServer/urls.pyc and b/mailServer/urls.pyc differ diff --git a/mailServer/views.pyc b/mailServer/views.pyc index 6a2bda211..fc8fe48b0 100644 Binary files a/mailServer/views.pyc and b/mailServer/views.pyc differ diff --git a/managePHP/__init__.pyc b/managePHP/__init__.pyc index 6142ce7e2..25fdf43a5 100644 Binary files a/managePHP/__init__.pyc and b/managePHP/__init__.pyc differ diff --git a/managePHP/admin.pyc b/managePHP/admin.pyc index 272a18a6d..530c4b36c 100644 Binary files a/managePHP/admin.pyc and b/managePHP/admin.pyc differ diff --git a/managePHP/migrations/__init__.pyc b/managePHP/migrations/__init__.pyc index 4bf69cd59..323713ea4 100644 Binary files a/managePHP/migrations/__init__.pyc and b/managePHP/migrations/__init__.pyc differ diff --git a/managePHP/models.pyc b/managePHP/models.pyc index ea173e711..0ce1c74df 100644 Binary files a/managePHP/models.pyc and b/managePHP/models.pyc differ diff --git a/managePHP/urls.pyc b/managePHP/urls.pyc index f35ed5a1b..317b1c113 100644 Binary files a/managePHP/urls.pyc and b/managePHP/urls.pyc differ diff --git a/managePHP/views.pyc b/managePHP/views.pyc index a569628d7..08efeb6ba 100644 Binary files a/managePHP/views.pyc and b/managePHP/views.pyc differ diff --git a/manageSSL/__init__.pyc b/manageSSL/__init__.pyc index 9919c9f70..51d57608d 100644 Binary files a/manageSSL/__init__.pyc and b/manageSSL/__init__.pyc differ diff --git a/manageSSL/admin.pyc b/manageSSL/admin.pyc index 3fe69d414..ae48dd7c0 100644 Binary files a/manageSSL/admin.pyc and b/manageSSL/admin.pyc differ diff --git a/manageSSL/migrations/__init__.pyc b/manageSSL/migrations/__init__.pyc index 12eee2e88..f6a4b5090 100644 Binary files a/manageSSL/migrations/__init__.pyc and b/manageSSL/migrations/__init__.pyc differ diff --git a/manageSSL/models.pyc b/manageSSL/models.pyc index 771436811..8e96a7b21 100644 Binary files a/manageSSL/models.pyc and b/manageSSL/models.pyc differ diff --git a/manageSSL/urls.pyc b/manageSSL/urls.pyc index 32a689055..b92b185a8 100644 Binary files a/manageSSL/urls.pyc and b/manageSSL/urls.pyc differ diff --git a/manageSSL/views.pyc b/manageSSL/views.pyc index 727631353..b38686a93 100644 Binary files a/manageSSL/views.pyc and b/manageSSL/views.pyc differ diff --git a/packages/__init__.pyc b/packages/__init__.pyc index 608d3b0df..46becf9f3 100644 Binary files a/packages/__init__.pyc and b/packages/__init__.pyc differ diff --git a/packages/admin.pyc b/packages/admin.pyc index 5cc47c1e5..8de82412a 100644 Binary files a/packages/admin.pyc and b/packages/admin.pyc differ diff --git a/packages/migrations/0001_initial.pyc b/packages/migrations/0001_initial.pyc index 4f7fbca7c..ebd459357 100644 Binary files a/packages/migrations/0001_initial.pyc and b/packages/migrations/0001_initial.pyc differ diff --git a/packages/migrations/__init__.pyc b/packages/migrations/__init__.pyc index c369aa4bf..a6f84aa66 100644 Binary files a/packages/migrations/__init__.pyc and b/packages/migrations/__init__.pyc differ diff --git a/packages/models.pyc b/packages/models.pyc index 1bf311c4e..f18474426 100644 Binary files a/packages/models.pyc and b/packages/models.pyc differ diff --git a/packages/urls.pyc b/packages/urls.pyc index 1384b0489..5cca1dbae 100644 Binary files a/packages/urls.pyc and b/packages/urls.pyc differ diff --git a/packages/views.pyc b/packages/views.pyc index 2d2208a87..9bdf17e00 100644 Binary files a/packages/views.pyc and b/packages/views.pyc differ diff --git a/plogical/CyberCPLogFileWriter.pyc b/plogical/CyberCPLogFileWriter.pyc index c5984f202..31c31319a 100644 Binary files a/plogical/CyberCPLogFileWriter.pyc and b/plogical/CyberCPLogFileWriter.pyc differ diff --git a/plogical/__init__.pyc b/plogical/__init__.pyc index dec0bc6d2..8c64080f5 100644 Binary files a/plogical/__init__.pyc and b/plogical/__init__.pyc differ diff --git a/plogical/backupUtilities.pyc b/plogical/backupUtilities.pyc index dbe57d8bd..a13bb82ed 100644 Binary files a/plogical/backupUtilities.pyc and b/plogical/backupUtilities.pyc differ diff --git a/plogical/dnsUtilities.pyc b/plogical/dnsUtilities.pyc index e23d8ac48..0b8460b06 100644 Binary files a/plogical/dnsUtilities.pyc and b/plogical/dnsUtilities.pyc differ diff --git a/plogical/firewallUtilities.pyc b/plogical/firewallUtilities.pyc index 49e8fc4eb..955deca7c 100644 Binary files a/plogical/firewallUtilities.pyc and b/plogical/firewallUtilities.pyc differ diff --git a/plogical/getSystemInformation.pyc b/plogical/getSystemInformation.pyc index 68e556a41..5bd140cb1 100644 Binary files a/plogical/getSystemInformation.pyc and b/plogical/getSystemInformation.pyc differ diff --git a/plogical/hashPassword.pyc b/plogical/hashPassword.pyc index d4bdf751d..9829f4f2c 100644 Binary files a/plogical/hashPassword.pyc and b/plogical/hashPassword.pyc differ diff --git a/plogical/installUtilities.pyc b/plogical/installUtilities.pyc index af8e3b5aa..4e80c0ee3 100644 Binary files a/plogical/installUtilities.pyc and b/plogical/installUtilities.pyc differ diff --git a/plogical/mysqlUtilities.pyc b/plogical/mysqlUtilities.pyc index 42df0f4ae..2c5808d0e 100644 Binary files a/plogical/mysqlUtilities.pyc and b/plogical/mysqlUtilities.pyc differ diff --git a/plogical/phpUtilities.pyc b/plogical/phpUtilities.pyc index 0aaa4ef33..76ec6a5b3 100644 Binary files a/plogical/phpUtilities.pyc and b/plogical/phpUtilities.pyc differ diff --git a/plogical/processUtilities.pyc b/plogical/processUtilities.pyc index e2ae36465..5b7271d5b 100644 Binary files a/plogical/processUtilities.pyc and b/plogical/processUtilities.pyc differ diff --git a/plogical/randomPassword.pyc b/plogical/randomPassword.pyc index d889e0881..c6a6e9698 100644 Binary files a/plogical/randomPassword.pyc and b/plogical/randomPassword.pyc differ diff --git a/plogical/sslUtilities.pyc b/plogical/sslUtilities.pyc index 1c0c28c56..4bc9958ee 100644 Binary files a/plogical/sslUtilities.pyc and b/plogical/sslUtilities.pyc differ diff --git a/plogical/tuning.pyc b/plogical/tuning.pyc index f95a6bd3a..51f7d544a 100644 Binary files a/plogical/tuning.pyc and b/plogical/tuning.pyc differ diff --git a/plogical/virtualHostUtilities.pyc b/plogical/virtualHostUtilities.pyc index 8c7559fdc..d8228a086 100644 Binary files a/plogical/virtualHostUtilities.pyc and b/plogical/virtualHostUtilities.pyc differ diff --git a/serverLogs/__init__.pyc b/serverLogs/__init__.pyc index 7010da2d8..21bea6a61 100644 Binary files a/serverLogs/__init__.pyc and b/serverLogs/__init__.pyc differ diff --git a/serverLogs/admin.pyc b/serverLogs/admin.pyc index fb494858d..e05cc0449 100644 Binary files a/serverLogs/admin.pyc and b/serverLogs/admin.pyc differ diff --git a/serverLogs/migrations/__init__.pyc b/serverLogs/migrations/__init__.pyc index 8721b43c2..42443eead 100644 Binary files a/serverLogs/migrations/__init__.pyc and b/serverLogs/migrations/__init__.pyc differ diff --git a/serverLogs/models.pyc b/serverLogs/models.pyc index 8905b554e..3bbd57612 100644 Binary files a/serverLogs/models.pyc and b/serverLogs/models.pyc differ diff --git a/serverLogs/urls.pyc b/serverLogs/urls.pyc index 7167ff0c8..964bbf448 100644 Binary files a/serverLogs/urls.pyc and b/serverLogs/urls.pyc differ diff --git a/serverLogs/views.pyc b/serverLogs/views.pyc index 943c0fd5a..5ca840732 100644 Binary files a/serverLogs/views.pyc and b/serverLogs/views.pyc differ diff --git a/serverStatus/__init__.pyc b/serverStatus/__init__.pyc index ab306a8b6..51f6321c3 100644 Binary files a/serverStatus/__init__.pyc and b/serverStatus/__init__.pyc differ diff --git a/serverStatus/admin.pyc b/serverStatus/admin.pyc index d3b09cb22..0bc398510 100644 Binary files a/serverStatus/admin.pyc and b/serverStatus/admin.pyc differ diff --git a/serverStatus/migrations/__init__.pyc b/serverStatus/migrations/__init__.pyc index dc2fe1626..d34242a28 100644 Binary files a/serverStatus/migrations/__init__.pyc and b/serverStatus/migrations/__init__.pyc differ diff --git a/serverStatus/models.pyc b/serverStatus/models.pyc index 3e99fa5f0..ec166d1f8 100644 Binary files a/serverStatus/models.pyc and b/serverStatus/models.pyc differ diff --git a/serverStatus/urls.pyc b/serverStatus/urls.pyc index 17fd13b11..9430f68f7 100644 Binary files a/serverStatus/urls.pyc and b/serverStatus/urls.pyc differ diff --git a/serverStatus/views.pyc b/serverStatus/views.pyc index 2e55a2511..25a53e317 100644 Binary files a/serverStatus/views.pyc and b/serverStatus/views.pyc differ diff --git a/static/websiteFunctions/websiteFunctions.js b/static/websiteFunctions/websiteFunctions.js index f783d00d5..fd76ef0fb 100644 --- a/static/websiteFunctions/websiteFunctions.js +++ b/static/websiteFunctions/websiteFunctions.js @@ -2071,4 +2071,346 @@ app.controller('suspendWebsiteControl', function($scope,$http) { -/* Java script code to suspend/un-suspend ends here */ \ No newline at end of file +/* Java script code to suspend/un-suspend ends here */ + + +/* Java script code to manage cron ends here */ + +app.controller('manageCronController', function($scope,$http) { + $("#manageCronLoading").hide(); + $("#modifyCronForm").hide(); + $("#cronTable").hide(); + $("#saveCronButton").hide(); + $("#addCronButton").hide(); + + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + $scope.fetchWebsites = function(){ + + $("#manageCronLoading").show(); + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + var websiteToBeModified = $scope.websiteToBeModified; + url = "/websites/getWebsiteCron"; + + var data = { + domain: websiteToBeModified, + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + if (response.data.getWebsiteCron == 0) + { + console.log(response.data); + $scope.errorMessage = response.data.error_message; + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").hide(); + $("#saveCronButton").hide(); + $("#addCronButton").hide(); + } + else{ + console.log(response.data); + var finalData = response.data.crons; + $scope.cronList = finalData; + $("#cronTable").show(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").hide(); + $("#saveCronButton").hide(); + $("#addCronButton").hide(); + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#cronTable").hide(); + $("#fetchCronFailure").show(); + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + } + }; + + $scope.fetchCron = function(cronLine){ + + $("#cronTable").show(); + $("#manageCronLoading").show(); + $("#modifyCronForm").show(); + $("#saveCronButton").show(); + $("#addCronButton").hide(); + + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + $scope.line = cronLine; + console.log($scope.line); + + var websiteToBeModified = $scope.websiteToBeModified; + url = "/websites/getCronbyLine"; + var data = { + domain: websiteToBeModified, + line: cronLine + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + console.log(response); + + if (response.data.getWebsiteCron == 0) + { + console.log(response.data); + $scope.errorMessage = response.data.error_message; + $("#cronTable").show(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").hide(); + $("#saveCronButton").hide(); + $("#addCronButton").hide(); + } + else{ + console.log(response.data); + + $scope.minute = response.data.cron.minute + $scope.hour = response.data.cron.hour + $scope.monthday = response.data.cron.monthday + $scope.month = response.data.cron.month + $scope.weekday = response.data.cron.weekday + $scope.command = response.data.cron.command + $scope.line = response.data.line + + $("#cronTable").show(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").fadeIn(); + $("#addCronButton").hide(); + $("#saveCronButton").show(); + + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#fetchCronFailure").show(); + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + } + }; + + $scope.populate = function(){ + splitTime = $scope.defined.split(" "); + $scope.minute = splitTime[0]; + $scope.hour = splitTime[1]; + $scope.monthday = splitTime[2]; + $scope.month = splitTime[3]; + $scope.weekday = splitTime[4]; + } + + $scope.addCronForm = function(){ + + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + $("#manageCronLoading").hide(); + if (!$scope.websiteToBeModified) { + alert("Please select a domain first"); + } + else + { + $scope.minute = $scope.hour = $scope.monthday = $scope.month = $scope.weekday = $scope.command = $scope.line = ""; + + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").show(); + $("#saveCronButton").hide() + $("#addCronButton").show(); + } + }; + + $scope.addCronFunc = function(){ + + $("#manageCronLoading").show(); + $scope.errorMessage = "test1"; + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + var websiteToBeModified = $scope.websiteToBeModified; + + url = "/websites/addNewCron"; + var data = { + domain : websiteToBeModified, + minute : $scope.minute, + hour : $scope.hour, + monthday : $scope.monthday, + month : $scope.month, + weekday : $scope.weekday, + command : $scope.command + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + console.log(response); + + if (response.data.addNewCron == 0) + { + console.log(response.data) + $scope.errorMessage = response.data.error_message; + console.log($scope.errorMessage) + $scope.errorMessage = "test2"; + console.log(response.data.error_message) + $("#manageCronLoading").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").show(); + } + else{ + console.log(response.data); + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#cronEditSuccess").show(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").hide(); + + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#addCronFailure").show(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + } + }; + + + $scope.removeCron = function(line){ + + $("#manageCronLoading").show(); + + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + url = "/websites/remCronbyLine"; + var data = { + domain : $scope.websiteToBeModified, + line : line + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + console.log(response); + + if (response.data.remCronbyLine == 0) + { + console.log(response.data) + $scope.errorMessage = response.data.error_message; + $("#manageCronLoading").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").show(); + } + else{ + console.log(response.data); + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#cronEditSuccess").show(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").hide(); + + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#addCronFailure").show(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + } + }; + + $scope.modifyCronFunc = function(){ + + $("#manageCronLoading").show(); + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + var websiteToBeModified = $scope.websiteToBeModified; + + url = "/websites/saveCronChanges"; + var data = { + domain : websiteToBeModified, + line : $scope.line, + minute : $scope.minute, + hour : $scope.hour, + monthday : $scope.monthday, + month : $scope.month, + weekday : $scope.weekday, + command : $scope.command + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + console.log(response); + + if (response.data.addNewCron == 0) + { + console.log(response.data) + $scope.errorMessage = response.data.error_message; + $("#manageCronLoading").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").show(); + } + else{ + console.log(response.data); + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#cronEditSuccess").show(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").hide(); + + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#addCronFailure").show(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + } + }; + +}); + + + +/* Java script code to manage cron ends here */ \ No newline at end of file diff --git a/tuning/__init__.pyc b/tuning/__init__.pyc index 4d8b43840..512819b1a 100644 Binary files a/tuning/__init__.pyc and b/tuning/__init__.pyc differ diff --git a/tuning/admin.pyc b/tuning/admin.pyc index 6f8b7d940..f83c4fc59 100644 Binary files a/tuning/admin.pyc and b/tuning/admin.pyc differ diff --git a/tuning/migrations/__init__.pyc b/tuning/migrations/__init__.pyc index 34fcfc8dd..882d51aa3 100644 Binary files a/tuning/migrations/__init__.pyc and b/tuning/migrations/__init__.pyc differ diff --git a/tuning/models.pyc b/tuning/models.pyc index ac6770294..e178de1f2 100644 Binary files a/tuning/models.pyc and b/tuning/models.pyc differ diff --git a/tuning/urls.pyc b/tuning/urls.pyc index 32ec086e9..f9f7f02c6 100644 Binary files a/tuning/urls.pyc and b/tuning/urls.pyc differ diff --git a/tuning/views.pyc b/tuning/views.pyc index ea2d82dcf..9e838bee4 100644 Binary files a/tuning/views.pyc and b/tuning/views.pyc differ diff --git a/userManagment/__init__.pyc b/userManagment/__init__.pyc index 932555a1f..79303648b 100644 Binary files a/userManagment/__init__.pyc and b/userManagment/__init__.pyc differ diff --git a/userManagment/admin.pyc b/userManagment/admin.pyc index 0f08cf20c..0c98d7f1c 100644 Binary files a/userManagment/admin.pyc and b/userManagment/admin.pyc differ diff --git a/userManagment/migrations/__init__.pyc b/userManagment/migrations/__init__.pyc index 1dcc82500..c509d5be8 100644 Binary files a/userManagment/migrations/__init__.pyc and b/userManagment/migrations/__init__.pyc differ diff --git a/userManagment/models.pyc b/userManagment/models.pyc index b8e025709..b8a242748 100644 Binary files a/userManagment/models.pyc and b/userManagment/models.pyc differ diff --git a/userManagment/urls.pyc b/userManagment/urls.pyc index ec2495aaf..cda7a23e3 100644 Binary files a/userManagment/urls.pyc and b/userManagment/urls.pyc differ diff --git a/userManagment/views.pyc b/userManagment/views.pyc index 0d8fbf126..f8db01028 100644 Binary files a/userManagment/views.pyc and b/userManagment/views.pyc differ diff --git a/websiteFunctions/__init__.pyc b/websiteFunctions/__init__.pyc index 6cdcdddf3..cdaa8605d 100644 Binary files a/websiteFunctions/__init__.pyc and b/websiteFunctions/__init__.pyc differ diff --git a/websiteFunctions/admin.pyc b/websiteFunctions/admin.pyc index a7f1d7fa0..bdf7c76e4 100644 Binary files a/websiteFunctions/admin.pyc and b/websiteFunctions/admin.pyc differ diff --git a/websiteFunctions/migrations/0001_initial.pyc b/websiteFunctions/migrations/0001_initial.pyc index c286cf43f..624f6b7c2 100644 Binary files a/websiteFunctions/migrations/0001_initial.pyc and b/websiteFunctions/migrations/0001_initial.pyc differ diff --git a/websiteFunctions/migrations/__init__.pyc b/websiteFunctions/migrations/__init__.pyc index 2b56a4eb8..d15d5fa75 100644 Binary files a/websiteFunctions/migrations/__init__.pyc and b/websiteFunctions/migrations/__init__.pyc differ diff --git a/websiteFunctions/models.pyc b/websiteFunctions/models.pyc index adb24a2bb..acb607e7b 100644 Binary files a/websiteFunctions/models.pyc and b/websiteFunctions/models.pyc differ diff --git a/websiteFunctions/static/websiteFunctions/websiteFunctions.js b/websiteFunctions/static/websiteFunctions/websiteFunctions.js index f783d00d5..fd76ef0fb 100644 --- a/websiteFunctions/static/websiteFunctions/websiteFunctions.js +++ b/websiteFunctions/static/websiteFunctions/websiteFunctions.js @@ -2071,4 +2071,346 @@ app.controller('suspendWebsiteControl', function($scope,$http) { -/* Java script code to suspend/un-suspend ends here */ \ No newline at end of file +/* Java script code to suspend/un-suspend ends here */ + + +/* Java script code to manage cron ends here */ + +app.controller('manageCronController', function($scope,$http) { + $("#manageCronLoading").hide(); + $("#modifyCronForm").hide(); + $("#cronTable").hide(); + $("#saveCronButton").hide(); + $("#addCronButton").hide(); + + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + $scope.fetchWebsites = function(){ + + $("#manageCronLoading").show(); + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + var websiteToBeModified = $scope.websiteToBeModified; + url = "/websites/getWebsiteCron"; + + var data = { + domain: websiteToBeModified, + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + if (response.data.getWebsiteCron == 0) + { + console.log(response.data); + $scope.errorMessage = response.data.error_message; + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").hide(); + $("#saveCronButton").hide(); + $("#addCronButton").hide(); + } + else{ + console.log(response.data); + var finalData = response.data.crons; + $scope.cronList = finalData; + $("#cronTable").show(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").hide(); + $("#saveCronButton").hide(); + $("#addCronButton").hide(); + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#cronTable").hide(); + $("#fetchCronFailure").show(); + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + } + }; + + $scope.fetchCron = function(cronLine){ + + $("#cronTable").show(); + $("#manageCronLoading").show(); + $("#modifyCronForm").show(); + $("#saveCronButton").show(); + $("#addCronButton").hide(); + + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + $scope.line = cronLine; + console.log($scope.line); + + var websiteToBeModified = $scope.websiteToBeModified; + url = "/websites/getCronbyLine"; + var data = { + domain: websiteToBeModified, + line: cronLine + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + console.log(response); + + if (response.data.getWebsiteCron == 0) + { + console.log(response.data); + $scope.errorMessage = response.data.error_message; + $("#cronTable").show(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").hide(); + $("#saveCronButton").hide(); + $("#addCronButton").hide(); + } + else{ + console.log(response.data); + + $scope.minute = response.data.cron.minute + $scope.hour = response.data.cron.hour + $scope.monthday = response.data.cron.monthday + $scope.month = response.data.cron.month + $scope.weekday = response.data.cron.weekday + $scope.command = response.data.cron.command + $scope.line = response.data.line + + $("#cronTable").show(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").fadeIn(); + $("#addCronButton").hide(); + $("#saveCronButton").show(); + + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#fetchCronFailure").show(); + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + } + }; + + $scope.populate = function(){ + splitTime = $scope.defined.split(" "); + $scope.minute = splitTime[0]; + $scope.hour = splitTime[1]; + $scope.monthday = splitTime[2]; + $scope.month = splitTime[3]; + $scope.weekday = splitTime[4]; + } + + $scope.addCronForm = function(){ + + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + $("#manageCronLoading").hide(); + if (!$scope.websiteToBeModified) { + alert("Please select a domain first"); + } + else + { + $scope.minute = $scope.hour = $scope.monthday = $scope.month = $scope.weekday = $scope.command = $scope.line = ""; + + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#modifyCronForm").show(); + $("#saveCronButton").hide() + $("#addCronButton").show(); + } + }; + + $scope.addCronFunc = function(){ + + $("#manageCronLoading").show(); + $scope.errorMessage = "test1"; + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + var websiteToBeModified = $scope.websiteToBeModified; + + url = "/websites/addNewCron"; + var data = { + domain : websiteToBeModified, + minute : $scope.minute, + hour : $scope.hour, + monthday : $scope.monthday, + month : $scope.month, + weekday : $scope.weekday, + command : $scope.command + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + console.log(response); + + if (response.data.addNewCron == 0) + { + console.log(response.data) + $scope.errorMessage = response.data.error_message; + console.log($scope.errorMessage) + $scope.errorMessage = "test2"; + console.log(response.data.error_message) + $("#manageCronLoading").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").show(); + } + else{ + console.log(response.data); + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#cronEditSuccess").show(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").hide(); + + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#addCronFailure").show(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + } + }; + + + $scope.removeCron = function(line){ + + $("#manageCronLoading").show(); + + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + url = "/websites/remCronbyLine"; + var data = { + domain : $scope.websiteToBeModified, + line : line + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + console.log(response); + + if (response.data.remCronbyLine == 0) + { + console.log(response.data) + $scope.errorMessage = response.data.error_message; + $("#manageCronLoading").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").show(); + } + else{ + console.log(response.data); + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#cronEditSuccess").show(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").hide(); + + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#addCronFailure").show(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + } + }; + + $scope.modifyCronFunc = function(){ + + $("#manageCronLoading").show(); + $("#addCronFailure").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + + var websiteToBeModified = $scope.websiteToBeModified; + + url = "/websites/saveCronChanges"; + var data = { + domain : websiteToBeModified, + line : $scope.line, + minute : $scope.minute, + hour : $scope.hour, + monthday : $scope.monthday, + month : $scope.month, + weekday : $scope.weekday, + command : $scope.command + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + console.log(response); + + if (response.data.addNewCron == 0) + { + console.log(response.data) + $scope.errorMessage = response.data.error_message; + $("#manageCronLoading").hide(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").show(); + } + else{ + console.log(response.data); + $("#cronTable").hide(); + $("#manageCronLoading").hide(); + $("#cronEditSuccess").show(); + $("#fetchCronFailure").hide(); + $("#addCronFailure").hide(); + + } + } + function cantLoadInitialDatas(response) { + $("#manageCronLoading").hide(); + $("#addCronFailure").show(); + $("#cronEditSuccess").hide(); + $("#fetchCronFailure").hide(); + } + }; + +}); + + + +/* Java script code to manage cron ends here */ \ No newline at end of file diff --git a/websiteFunctions/templates/websiteFunctions/listCron.html b/websiteFunctions/templates/websiteFunctions/listCron.html new file mode 100644 index 000000000..9908f6e8b --- /dev/null +++ b/websiteFunctions/templates/websiteFunctions/listCron.html @@ -0,0 +1,181 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Cron Management - CyberPanel" %}{% endblock %} +{% block content %} + +{% load static %} +{% get_current_language as LANGUAGE_CODE %} + + +
{% trans "Create, edit or delete your cron from this page." %}
+
+