Updating configuration (#197)

#### Added

- [ACME] Display warning about sudo usage when issuing certificate with DNS API validation (require `sudo -E`)

#### Changed

- [ACME] Resolve domain IP over HTTPS with Cloudflare DNS Resolver
- [CORE] Cement Framework updated to v2.10.2
- [SITE] database name = 0 to 16 characters from the site name + 4 randomly generated character
- [SITE] database user = 0 to 12 characters from the site name + 4 randomy generated character
- [STACK] Improve sysctl tweak deployment

#### Fixed

- [SITE] https redirection missing on subdomains sites
- Issues with digitalocean mariadb repository
- Cement Framework output handler issues
- [CLEAN] check if Nginx is installed before purging fastcgi or opcache
This commit is contained in:
VirtuBox
2019-11-11 19:06:11 +01:00
committed by GitHub
parent 8698332013
commit b771b2578e
59 changed files with 838 additions and 961 deletions

View File

@@ -8,6 +8,27 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
### v3.9.x - [Unreleased]
### v3.10.3 - 2019-11-11
#### Added
- [ACME] Display warning about sudo usage when issuing certificate with DNS API validation (require `sudo -E`)
#### Changed
- [ACME] Resolve domain IP over HTTPS with Cloudflare DNS Resolver
- [CORE] Cement Framework updated to v2.10.2
- [SITE] database name = 0 to 16 characters from the site name + 4 randomly generated character
- [SITE] database user = 0 to 12 characters from the site name + 4 randomy generated character
- [STACK] Improve sysctl tweak deployment
#### Fixed
- [SITE] https redirection missing on subdomains sites
- Issues with digitalocean mariadb repository
- Cement Framework output handler issues
- [CLEAN] check if Nginx is installed before purging fastcgi or opcache
### v3.10.2 - 2019-11-06
#### Added

14
install
View File

@@ -9,7 +9,7 @@
# -------------------------------------------------------------------------
# wget -qO wo wops.cc && sudo bash wo
# -------------------------------------------------------------------------
# Version 3.10.2 - 2019-11-06
# Version 3.10.3 - 2019-11-11
# -------------------------------------------------------------------------
# CONTENTS
@@ -207,13 +207,13 @@ wo_install_dep() {
if [ "$wo_linux_distro" == "Ubuntu" ]; then
# install dependencies
apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \
build-essential curl gzip python3-pip python3-wheel python3-apt python3-setuptools python3-dev sqlite3 git tar software-properties-common pigz \
build-essential curl gzip python3-pip python3-apt python3-dev sqlite3 git tar software-properties-common pigz \
gnupg2 cron ccze rsync apt-transport-https tree haveged ufw unattended-upgrades tzdata ntp >/dev/null 2>&1
curl -sL https://download.opensuse.org/repositories/home:/virtubox:/WordOps/xUbuntu_18.04/Release.key | apt-key add -
else
# install dependencies
apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \
build-essential curl gzip dirmngr sudo python3-pip python3-wheel python3-apt python3-setuptools python3-dev ca-certificates sqlite3 git tar \
build-essential curl gzip dirmngr sudo python3-pip python3-apt python3-dev ca-certificates sqlite3 git tar \
software-properties-common pigz apt-transport-https gnupg2 cron ccze rsync tree haveged ufw unattended-upgrades tzdata ntp >/dev/null 2>&1
# add php repository gpg key
[ -d /etc/apt/trusted.gpg.d ] && { wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg; }
@@ -631,7 +631,13 @@ wo_init() {
if [ -z "$wo_travis" ]; then
# import easyengine opensusebuildservice gpg key to avoid issues with packages update
apt-key adv --keyserver hkp://keyserver.ubuntu.com --recv-keys 3050ac3cd2ae6f03 > /dev/null 2>&1
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3050ac3cd2ae6f03 > /dev/null 2>&1
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xF1656F24C74CD1D8 > /dev/null 2>&1
# fix digitalocean mariadb repository issue
sed -i 's/sfo1.mirrors.digitalocean.com\/mariadb/mariadb.mirrors.ovh.net\/MariaDB/' /etc/apt/sources.list.d/*.list > /dev/null 2>&1
if [ -f /etc/apt/preferences.d/MariaDB.pref ]; then
sed -i 's/sfo1.mirrors.digitalocean.com/mariadb.mirrors.ovh.net/' /etc/apt/preferences.d/MariaDB.pref > /dev/null 2>&1
fi
if ! {
apt-get update --allow-releaseinfo-change -qq >/dev/null 2>&1
}; then

View File

@@ -1,4 +1,4 @@
cement==2.8.2
cement==2.10.12
pystache>=0.5.4
pynginxconfig>=0.3.4
PyMySQL>=0.9.3

View File

@@ -27,7 +27,7 @@ if os.geteuid() == 0:
os.makedirs('/var/lib/wo/tmp/')
setup(name='wordops',
version='3.10.2',
version='3.10.3',
description='An essential toolset that eases server administration',
long_description=LONG,
long_description_content_type='text/markdown',
@@ -55,7 +55,7 @@ setup(name='wordops',
# Required to build documentation
# "Sphinx >= 1.0",
# Required to function
'cement == 2.8.2',
'cement == 2.10.12',
'pystache >= 0.5.4',
'pynginxconfig >= 0.3.4',
'PyMySQL >= 0.9.3',

View File

@@ -1,49 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseStack(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
def test_wo_cli_stack_install_nginx(self):
self.app = get_test_app(argv=['stack', 'install', '--nginx'])
self.app.setup()
self.app.run()
def test_wo_cli_stack_install_php(self):
self.app = get_test_app(argv=['stack', 'install', '--php'])
self.app.setup()
self.app.run()
def test_wo_cli_stack_install_php73(self):
self.app = get_test_app(argv=['stack', 'install', '--php73'])
self.app.setup()
self.app.run()
def test_wo_cli_stack_install_mysql(self):
self.app = get_test_app(argv=['stack', 'install', '--mysql'])
self.app.setup()
self.app.run()
def test_wo_cli_stack_install_wpcli(self):
self.app = get_test_app(argv=['stack', 'install', '--wpcli'])
self.app.setup()
self.app.run()
def test_wo_cli_stack_install_phpmyadmin(self):
self.app = get_test_app(argv=['stack', 'install', '--phpmyadmin'])
self.app.setup()
self.app.run()
def test_wo_cli_stack_install_adminer(self):
self.app = get_test_app(argv=['stack', 'install', '--adminer'])
self.app.setup()
self.app.run()
def test_wo_cli_stack_install_utils(self):
self.app = get_test_app(argv=['stack', 'install', '--utils'])
self.app.setup()
self.app.run()

View File

@@ -0,0 +1,41 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseStack(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_stack_install_nginx(self):
with WOTestApp(argv=['stack', 'install', '--nginx']) as app:
app.run()
def test_wo_cli_stack_install_php(self):
with WOTestApp(argv=['stack', 'install', '--php']) as app:
app.run()
def test_wo_cli_stack_install_php73(self):
with WOTestApp(argv=['stack', 'install', '--php73']) as app:
app.run()
def test_wo_cli_stack_install_mysql(self):
with WOTestApp(argv=['stack', 'install', '--mysql']) as app:
app.run()
def test_wo_cli_stack_install_wpcli(self):
with WOTestApp(argv=['stack', 'install', '--wpcli']) as app:
app.run()
def test_wo_cli_stack_install_phpmyadmin(self):
with WOTestApp(argv=['stack', 'install', '--phpmyadmin']) as app:
app.run()
def test_wo_cli_stack_install_adminer(self):
with WOTestApp(argv=['stack', 'install', '--adminer']) as app:
app.run()
def test_wo_cli_stack_install_utils(self):
with WOTestApp(argv=['stack', 'install', '--utils']) as app:
app.run()

View File

@@ -0,0 +1,25 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseStackStop(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_stack_services_stop_nginx(self):
with WOTestApp(argv=['stack', 'stop', '--nginx']) as app:
app.run()
def test_wo_cli_stack_services_stop_php_fpm(self):
with WOTestApp(argv=['stack', 'stop', '--php']) as app:
app.run()
def test_wo_cli_stack_services_stop_mysql(self):
with WOTestApp(argv=['stack', 'stop', '--mysql']) as app:
app.run()
def test_wo_cli_stack_services_stop_all(self):
with WOTestApp(argv=['stack', 'stop']) as app:
app.run()

View File

@@ -0,0 +1,25 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseStackStart(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_stack_services_start_nginx(self):
with WOTestApp(argv=['stack', 'start', '--nginx']) as app:
app.run()
def test_wo_cli_stack_services_start_php_fpm(self):
with WOTestApp(argv=['stack', 'start', '--php']) as app:
app.run()
def test_wo_cli_stack_services_start_mysql(self):
with WOTestApp(argv=['stack', 'start', '--mysql']) as app:
app.run()
def test_wo_cli_stack_services_start_all(self):
with WOTestApp(argv=['stack', 'start']) as app:
app.run()

View File

@@ -0,0 +1,25 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseStackRestart(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_stack_services_restart_nginx(self):
with WOTestApp(argv=['stack', 'restart', '--nginx']) as app:
app.run()
def test_wo_cli_stack_services_restart_php_fpm(self):
with WOTestApp(argv=['stack', 'restart', '--php']) as app:
app.run()
def test_wo_cli_stack_services_restart_mysql(self):
with WOTestApp(argv=['stack', 'restart', '--mysql']) as app:
app.run()
def test_wo_cli_stack_services_restart_all(self):
with WOTestApp(argv=['stack', 'restart']) as app:
app.run()

View File

@@ -0,0 +1,25 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseStackStatus(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_stack_services_status_nginx(self):
with WOTestApp(argv=['stack', 'status', '--nginx']) as app:
app.run()
def test_wo_cli_stack_services_status_php_fpm(self):
with WOTestApp(argv=['stack', 'status', '--php']) as app:
app.run()
def test_wo_cli_stack_services_status_mysql(self):
with WOTestApp(argv=['stack', 'status', '--mysql']) as app:
app.run()
def test_wo_cli_stack_services_status_all(self):
with WOTestApp(argv=['stack', 'status']) as app:
app.run()

View File

@@ -0,0 +1,50 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSiteCreate(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_site_create_html(self):
with WOTestApp(argv=['site', 'create', 'example1.com',
'--html']) as app:
app.config.set('wo', '', True)
app.run()
def test_wo_cli_site_create_php(self):
with WOTestApp(argv=['site', 'create', 'example2.com',
'--php']) as app:
app.run()
def test_wo_cli_site_create_mysql(self):
with WOTestApp(argv=['site', 'create', 'example3.com',
'--mysql']) as app:
app.run()
def test_wo_cli_site_create_wp(self):
with WOTestApp(argv=['site', 'create', 'example4.com',
'--wp']) as app:
app.run()
def test_wo_cli_site_create_wpsubdir(self):
with WOTestApp(argv=['site', 'create', 'example5.com',
'--wpsubdir']) as app:
app.run()
def test_wo_cli_site_create_wpsubdomain(self):
with WOTestApp(argv=['site', 'create', 'example6.com',
'--wpsubdomain']) as app:
app.run()
def test_wo_cli_site_create_wpfc(self):
with WOTestApp(argv=['site', 'create', 'example8.com',
'--wpfc']) as app:
app.run()
def test_wo_cli_site_create_wpsc(self):
with WOTestApp(argv=['site', 'create', 'example9.com',
'--wpsc']) as app:
app.run()

View File

@@ -0,0 +1,13 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSiteDisable(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_site_disable(self):
with WOTestApp(argv=['site', 'disable', 'example2.com']) as app:
app.run()

View File

@@ -0,0 +1,13 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSiteEnable(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_site_enable(self):
with WOTestApp(argv=['site', 'enable', 'example2.com']) as app:
app.run()

View File

@@ -0,0 +1,13 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSiteInfo(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_site_info(self):
with WOTestApp(argv=['site', 'info', 'example1.com']) as app:
app.run()

View File

@@ -0,0 +1,17 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSiteList(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_site_list_enable(self):
with WOTestApp(argv=['site', 'list', '--enabled']) as app:
app.run()
def test_wo_cli_site_list_disable(self):
with WOTestApp(argv=['site', 'list', '--disabled']) as app:
app.run()

View File

@@ -0,0 +1,13 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSiteShow(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_show_edit(self):
with WOTestApp(argv=['site', 'show', 'example1.com']) as app:
app.run()

View File

@@ -0,0 +1,49 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSiteUpdate(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_site_update_html(self):
with WOTestApp(argv=['site', 'update', 'example2.com',
'--html']) as app:
app.run()
def test_wo_cli_site_update_php(self):
with WOTestApp(argv=['site', 'update', 'example1.com',
'--php']) as app:
app.run()
def test_wo_cli_site_update_mysql(self):
with WOTestApp(argv=['site', 'update', 'example1.com',
'--html']) as app:
app.run()
def test_wo_cli_site_update_wp(self):
with WOTestApp(argv=['site', 'update', 'example5.com',
'--wp']) as app:
app.run()
def test_wo_cli_site_update_wpsubdir(self):
with WOTestApp(argv=['site', 'update', 'example4.com',
'--wpsubdir']) as app:
app.run()
def test_wo_cli_site_update_wpsubdomain(self):
with WOTestApp(argv=['site', 'update', 'example7.com',
'--wpsubdomain']) as app:
app.run()
def test_wo_cli_site_update_wpfc(self):
with WOTestApp(argv=['site', 'update', 'example9.com',
'--wpfc']) as app:
app.run()
def test_wo_cli_site_update_wpsc(self):
with WOTestApp(argv=['site', 'update', 'example6.com',
'--wpsc']) as app:
app.run()

View File

@@ -0,0 +1,29 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseClean(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_clean(self):
with WOTestApp(argv=['clean']) as app:
app.run()
def test_wo_cli_clean_fastcgi(self):
with WOTestApp(argv=['clean', '--fastcgi']) as app:
app.run()
def test_wo_cli_clean_all(self):
with WOTestApp(argv=['clean', '--all']) as app:
app.run()
def test_wo_cli_clean_opcache(self):
with WOTestApp(argv=['clean', '--opcache']) as app:
app.run()
def test_wo_cli_clean_redis(self):
with WOTestApp(argv=['clean', '--redis']) as app:
app.run()

View File

@@ -0,0 +1,66 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseDebug(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_debug_stop(self):
with WOTestApp(argv=['debug', '--stop']) as app:
app.run()
def test_wo_cli_debug_start(self):
with WOTestApp(argv=['debug', '--start']) as app:
app.run()
def test_wo_cli_debug_php(self):
with WOTestApp(argv=['debug', '--php']) as app:
app.run()
def test_wo_cli_debug_nginx(self):
with WOTestApp(argv=['debug', '--nginx']) as app:
app.run()
def test_wo_cli_debug_rewrite(self):
with WOTestApp(argv=['debug', '--rewrite']) as app:
app.run()
def test_wo_cli_debug_fpm(self):
with WOTestApp(argv=['debug', '--fpm']) as app:
app.run()
def test_wo_cli_debug_mysql(self):
with WOTestApp(argv=['debug', '--mysql']) as app:
app.run()
def test_wo_cli_debug_import_slow_log_interval(self):
with WOTestApp(argv=['debug', '--mysql',
'--import-slow-log-interval']) as app:
app.run()
def test_wo_cli_debug_site_name_mysql(self):
with WOTestApp(argv=['debug', 'example3.com', '--mysql']) as app:
app.run()
def test_wo_cli_debug_site_name_wp(self):
with WOTestApp(argv=['debug', 'example4.com', '--wp']) as app:
app.run()
def test_wo_cli_debug_site_name_nginx(self):
with WOTestApp(argv=['debug', 'example4.com', '--nginx']) as app:
app.run()
def test_wo_cli_debug_site_name_start(self):
with WOTestApp(argv=['debug', 'example1.com', '--start']) as app:
app.run()
def test_wo_cli_debug_site_name_stop(self):
with WOTestApp(argv=['debug', 'example1.com', '--stop']) as app:
app.run()
def test_wo_cli_debug_site_name_rewrite(self):
with WOTestApp(argv=['debug', 'example1.com', '--rewrite']) as app:
app.run()

21
tests/cli/27_test_info.py Normal file
View File

@@ -0,0 +1,21 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseInfo(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_info_mysql(self):
with WOTestApp(argv=['info', '--mysql']) as app:
app.run()
def test_wo_cli_info_php(self):
with WOTestApp(argv=['info', '--php']) as app:
app.run()
def test_wo_cli_info_nginx(self):
with WOTestApp(argv=['info', '--nginx']) as app:
app.run()

View File

@@ -0,0 +1,21 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSecure(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_secure_auth(self):
with WOTestApp(argv=['secure', '--auth', 'abc', 'superpass']) as app:
app.run()
def test_wo_cli_secure_port(self):
with WOTestApp(argv=['secure', '--port', '22222']) as app:
app.run()
def test_wo_cli_secure_ip(self):
with WOTestApp(argv=['secure', '--ip', '172.16.0.1']) as app:
app.run()

View File

@@ -0,0 +1,29 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseSiteDelete(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_site_detele(self):
with WOTestApp(argv=['site', 'delete', 'example1.com',
'--no-prompt']) as app:
app.run()
def test_wo_cli_site_detele_all(self):
with WOTestApp(argv=['site', 'delete', 'example2.com',
'--all', '--no-prompt']) as app:
app.run()
def test_wo_cli_site_detele_db(self):
with WOTestApp(argv=['site', 'delete', 'example3.com',
'--db', '--no-prompt']) as app:
app.run()
def test_wo_cli_site_detele_files(self):
with WOTestApp(argv=['site', 'delete', 'example4.com',
'--files', '--no-prompt']) as app:
app.run()

View File

@@ -1,34 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseStack(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_start_nginx(self):
self.app = get_test_app(argv=['stack', 'start', '--nginx'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_start_php_fpm(self):
self.app = get_test_app(argv=['stack', 'start', '--php'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_start_mysql(self):
self.app = get_test_app(argv=['stack', 'start', '--mysql'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_start_all(self):
self.app = get_test_app(argv=['stack', 'start'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -0,0 +1,43 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseStackRemove(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_stack_remove_admin(self):
with WOTestApp(argv=['stack', 'remove', '--admin', '--force']) as app:
app.run()
def test_wo_cli_stack_remove_nginx(self):
with WOTestApp(argv=['stack', 'remove', '--nginx', '--force']) as app:
app.run()
def test_wo_cli_stack_remove_php(self):
with WOTestApp(argv=['stack', 'remove', '--php', '--force']) as app:
app.run()
def test_wo_cli_stack_remove_mysql(self):
with WOTestApp(argv=['stack', 'remove', '--mysql', '--force']) as app:
app.run()
def test_wo_cli_stack_remove_wpcli(self):
with WOTestApp(argv=['stack', 'remove', '--wpcli', '--force']) as app:
app.run()
def test_wo_cli_stack_remove_phpmyadmin(self):
with WOTestApp(argv=['stack', 'remove',
'--phpmyadmin', '--force']) as app:
app.run()
def test_wo_cli_stack_remove_adminer(self):
with WOTestApp(
argv=['stack', 'remove', '--adminer', '--force']) as app:
app.run()
def test_wo_cli_stack_remove_utils(self):
with WOTestApp(argv=['stack', 'remove', '--utils', '--force']) as app:
app.run()

View File

@@ -0,0 +1,54 @@
from wo.utils import test
from wo.cli.main import WOTestApp
class CliTestCaseStackPurge(test.WOTestCase):
def test_wo_cli(self):
with WOTestApp as app:
app.run()
def test_wo_cli_stack_purge_web(self):
with WOTestApp(
argv=['stack', 'purge', '--web', '--force']) as app:
app.run()
def test_wo_cli_stack_purge_admin(self):
with WOTestApp(
argv=['stack', 'purge', '--admin', '--force']) as app:
app.run()
def test_wo_cli_stack_purge_nginx(self):
with WOTestApp(
argv=['stack', 'purge', '--nginx', '--force']) as app:
app.run()
def test_wo_cli_stack_purge_php(self):
with WOTestApp(argv=['stack', 'purge',
'--php', '--force']) as app:
app.run()
def test_wo_cli_stack_purge_mysql(self):
with WOTestApp(argv=['stack', 'purge',
'--mysql', '--force']) as app:
app.run()
def test_wo_cli_stack_purge_wpcli(self):
with WOTestApp(argv=['stack', 'purge',
'--wpcli', '--force']) as app:
app.run()
def test_wo_cli_stack_purge_phpmyadmin(self):
with WOTestApp(
argv=['stack', 'purge', '--phpmyadmin', '--force']) as app:
app.run()
def test_wo_cli_stack_purge_adminer(self):
with WOTestApp(
argv=['stack', 'purge', '--adminer', '--force']) as app:
app.run()
def test_wo_cli_stack_purge_utils(self):
with WOTestApp(argv=['stack', 'purge',
'--utils', '--force']) as app:
app.run()

View File

@@ -1,34 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseStack(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_status_nginx(self):
self.app = get_test_app(argv=['stack', 'status', '--nginx'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_status_php_fpm(self):
self.app = get_test_app(argv=['stack', 'status', '--php'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_status_mysql(self):
self.app = get_test_app(argv=['stack', 'status', '--mysql'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_status_all(self):
self.app = get_test_app(argv=['stack', 'status'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,34 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseStack(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_stop_nginx(self):
self.app = get_test_app(argv=['stack', 'stop', '--nginx'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_stop_php_fpm(self):
self.app = get_test_app(argv=['stack', 'stop', '--php'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_stop_mysql(self):
self.app = get_test_app(argv=['stack', 'stop', '--mysql'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_stop_all(self):
self.app = get_test_app(argv=['stack', 'stop'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,34 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseStack(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_restart_nginx(self):
self.app = get_test_app(argv=['stack', 'restart', '--nginx'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_restart_php_fpm(self):
self.app = get_test_app(argv=['stack', 'restart', '--php'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_restart_mysql(self):
self.app = get_test_app(argv=['stack', 'restart', '--mysql'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_services_restart_all(self):
self.app = get_test_app(argv=['stack', 'restart'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,66 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSite(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_create_html(self):
self.app = get_test_app(argv=['site', 'create', 'example1.com',
'--html'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_create_php(self):
self.app = get_test_app(argv=['site', 'create', 'example2.com',
'--php'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_create_mysql(self):
self.app = get_test_app(argv=['site', 'create', 'example3.com',
'--mysql'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_create_wp(self):
self.app = get_test_app(argv=['site', 'create', 'example4.com',
'--wp'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_create_wpsubdir(self):
self.app = get_test_app(argv=['site', 'create', 'example5.com',
'--wpsubdir'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_create_wpsubdomain(self):
self.app = get_test_app(argv=['site', 'create', 'example6.com',
'--wpsubdomain'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_create_wpfc(self):
self.app = get_test_app(argv=['site', 'create', 'example8.com',
'--wpfc'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_create_wpsc(self):
self.app = get_test_app(argv=['site', 'create', 'example9.com',
'--wpsc'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,16 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSite(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_info(self):
self.app = get_test_app(argv=['site', 'info', 'example1.com'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,22 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSite(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_list_enable(self):
self.app = get_test_app(argv=['site', 'list', '--enabled'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_list_disable(self):
self.app = get_test_app(argv=['site', 'list', '--disabled'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,16 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSite(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_show_edit(self):
self.app = get_test_app(argv=['site', 'show', 'example1.com'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,66 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSite(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_update_html(self):
self.app = get_test_app(argv=['site', 'update', 'example2.com',
'--html'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_update_php(self):
self.app = get_test_app(argv=['site', 'update', 'example1.com',
'--php'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_update_mysql(self):
self.app = get_test_app(argv=['site', 'update', 'example1.com',
'--html'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_update_wp(self):
self.app = get_test_app(argv=['site', 'update', 'example5.com',
'--wp'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_update_wpsubdir(self):
self.app = get_test_app(argv=['site', 'update', 'example4.com',
'--wpsubdir'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_update_wpsubdomain(self):
self.app = get_test_app(argv=['site', 'update', 'example7.com',
'--wpsubdomain'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_update_wpfc(self):
self.app = get_test_app(argv=['site', 'update', 'example9.com',
'--wpfc'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_update_wpsc(self):
self.app = get_test_app(argv=['site', 'update', 'example6.com',
'--wpsc'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,16 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSite(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_enable(self):
self.app = get_test_app(argv=['site', 'enable', 'example2.com'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,16 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSite(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_disable(self):
self.app = get_test_app(argv=['site', 'disable', 'example2.com'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,9 +0,0 @@
"""Tests for Example Plugin."""
from wo.utils.test import WOTestCase
class ExamplePluginTestCase(WOTestCase):
def test_load_example_plugin(self):
self.app.setup()
self.app.plugin.load_plugin('example')

View File

@@ -1,34 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseClean(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_clean(self):
self.app = get_test_app(argv=['clean'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_clean_fastcgi(self):
self.app = get_test_app(argv=['clean', '--fastcgi'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_clean_all(self):
self.app = get_test_app(argv=['clean', '--all'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_clean_opcache(self):
self.app = get_test_app(argv=['clean', '--opcache'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,95 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseDebug(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_stop(self):
self.app = get_test_app(argv=['debug', '--stop'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_start(self):
self.app = get_test_app(argv=['debug', '--start'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_php(self):
self.app = get_test_app(argv=['debug', '--php'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_nginx(self):
self.app = get_test_app(argv=['debug', '--nginx'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_rewrite(self):
self.app = get_test_app(argv=['debug', '--rewrite'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_fpm(self):
self.app = get_test_app(argv=['debug', '--fpm'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_mysql(self):
self.app = get_test_app(argv=['debug', '--mysql'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_import_slow_log_interval(self):
self.app = get_test_app(argv=['debug', '--mysql',
'--import-slow-log-interval'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_site_name_mysql(self):
self.app = get_test_app(argv=['debug', 'example3.com', '--mysql'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_site_name_wp(self):
self.app = get_test_app(argv=['debug', 'example4.com', '--wp'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_site_name_nginx(self):
self.app = get_test_app(argv=['debug', 'example4.com', '--nginx'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_site_name_start(self):
self.app = get_test_app(argv=['debug', 'example1.com', '--start'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_site_name_stop(self):
self.app = get_test_app(argv=['debug', 'example1.com', '--stop'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_debug_site_name_rewrite(self):
self.app = get_test_app(argv=['debug', 'example1.com', '--rewrite'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,28 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseInfo(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_info_mysql(self):
self.app = get_test_app(argv=['info', '--mysql'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_info_php(self):
self.app = get_test_app(argv=['info', '--php'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_info_nginx(self):
self.app = get_test_app(argv=['info', '--nginx'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,28 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSecure(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_secure_auth(self):
self.app = get_test_app(argv=['secure', '--auth', 'abc', 'superpass'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_secure_port(self):
self.app = get_test_app(argv=['secure', '--port', '22222'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_secure_ip(self):
self.app = get_test_app(argv=['secure', '--ip', '172.16.0.1'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,38 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseSite(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_detele(self):
self.app = get_test_app(argv=['site', 'delete', 'example1.com',
'--no-prompt'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_detele_all(self):
self.app = get_test_app(argv=['site', 'delete', 'example2.com',
'--all', '--no-prompt'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_detele_db(self):
self.app = get_test_app(argv=['site', 'delete', 'example3.com',
'--db', '--no-prompt'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_site_detele_files(self):
self.app = get_test_app(argv=['site', 'delete', 'example4.com',
'--files', '--no-prompt'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,73 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseStack(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_web(self):
self.app = get_test_app(argv=['stack', 'purge',
'--web', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_admin(self):
self.app = get_test_app(argv=['stack', 'purge',
'--admin', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_nginx(self):
self.app = get_test_app(argv=['stack', 'purge',
'--nginx', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_php(self):
self.app = get_test_app(argv=['stack', 'purge',
'--php', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_mysql(self):
self.app = get_test_app(argv=['stack', 'purge',
'--mysql', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_wpcli(self):
self.app = get_test_app(argv=['stack', 'purge',
'--wpcli', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_phpmyadmin(self):
self.app = get_test_app(
argv=['stack', 'purge', '--phpmyadmin', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_adminer(self):
self.app = get_test_app(
argv=['stack', 'purge', '--adminer', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_purge_utils(self):
self.app = get_test_app(argv=['stack', 'purge',
'--utils', '--force'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -1,66 +0,0 @@
from wo.utils import test
from wo.cli.main import get_test_app
class CliTestCaseStack(test.WOTestCase):
def test_wo_cli(self):
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_remove_web(self):
self.app = get_test_app(argv=['stack', 'remove', '--web', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_install_admin(self):
self.app = get_test_app(argv=['stack', 'remove', '--admin', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_install_nginx(self):
self.app = get_test_app(argv=['stack', 'remove', '--nginx', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_install_php(self):
self.app = get_test_app(argv=['stack', 'remove', '--php', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_install_mysql(self):
self.app = get_test_app(argv=['stack', 'remove', '--mysql', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_install_wpcli(self):
self.app = get_test_app(argv=['stack', 'remove', '--wpcli', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_install_phpmyadmin(self):
self.app = get_test_app(argv=['stack', 'remove',
'--phpmyadmin', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_install_adminer(self):
self.app = get_test_app(
argv=['stack', 'remove', '--adminer', '--force'])
self.app.setup()
self.app.run()
self.app.close()
def test_wo_cli_stack_install_utils(self):
self.app = get_test_app(argv=['stack', 'remove', '--utils', '--force'])
self.app.setup()
self.app.run()
self.app.close()

View File

@@ -15,9 +15,11 @@ export LANG='en_US.UTF-8'
export LC_ALL='C.UTF-8'
if [ -z "$1" ]; then
{
apt-get -qq purge mysql* graphviz* redis*
apt-get install -qq git python3-setuptools python3-dev python3-apt ccze tree
sudo apt-get -qq autoremove --purge
} > /dev/null 2>&1
fi
exit_script() {
@@ -221,10 +223,21 @@ else
fi
echo -e "${CGREEN}#############################################${CEND}"
echo -e ' various informations '
echo -e ' WP-CLI info '
echo -e "${CGREEN}#############################################${CEND}"
wp --allow-root --info
echo
echo -e "${CGREEN}#############################################${CEND}"
echo -e ' wo site info '
echo -e "${CGREEN}#############################################${CEND}"
wo site info wp.net
echo
echo -e "${CGREEN}#############################################${CEND}"
echo -e ' wo info '
echo -e "${CGREEN}#############################################${CEND}"
wo info
echo -e "${CGREEN}#############################################${CEND}"

View File

@@ -1,21 +0,0 @@
# Based on https://github.com/datafolklabs/cement/issues/295
# To avoid encoding releated error,we defined our custom output handler
# I hope we will remove this when we upgarde to Cement 2.6 (Not released yet)
import os
from cement.ext.ext_mustache import MustacheOutputHandler
from cement.utils import fs
class WOOutputHandler(MustacheOutputHandler):
class Meta:
label = 'wo_output_handler'
def _load_template_from_file(self, path):
for templ_dir in self.app._meta.template_dirs:
full_path = fs.abspath(os.path.join(templ_dir, path))
if os.path.exists(full_path):
self.app.log.debug('loading template file %s' % full_path)
return open(full_path, encoding='utf-8', mode='r').read()
else:
continue

View File

@@ -1,13 +1,12 @@
"""WordOps main application entry point."""
import os
import sys
from os import geteuid
from cement.core.exc import CaughtSignal, FrameworkError
from cement.core.foundation import CementApp
from cement.ext.ext_argparse import ArgParseArgumentHandler
from cement.utils.misc import init_defaults
from wo.cli.ext.wo_outputhandler import WOOutputHandler
from wo.core import exc
# this has to happen after you import sys, but before you import anything
@@ -32,6 +31,17 @@ defaults['wo']['plugin_dir'] = '/var/lib/wo/plugins'
defaults['wo']['template_dir'] = '/var/lib/wo/templates'
def encode_output(app, text):
""" Encode the output to be suitable for the terminal
:param app: The Cement App (unused)
:param text: The rendered text
:return: The encoded text
"""
return text.encode("utf-8")
class WOArgHandler(ArgParseArgumentHandler):
class Meta:
label = 'wo_args_handler'
@@ -57,8 +67,11 @@ class WOApp(CementApp):
extensions = ['mustache']
# default output handler
output_handler = WOOutputHandler
hooks = [
("post_render", encode_output)
]
output_handler = 'mustache'
arg_handler = WOArgHandler
@@ -91,7 +104,7 @@ def main():
global sys
# if not root...kick out
if not os.geteuid() == 0:
if not geteuid() == 0:
print("\nNon-privileged users cant use WordOps. "
"Switch to root or invoke sudo.\n")
app.close(1)
@@ -103,14 +116,14 @@ def main():
# Catch our application errors and exit 1 (error)
print('WOError > %s' % e)
app.exit_code = 1
except FrameworkError as e:
# Catch framework errors and exit 1 (error)
print('FrameworkError > %s' % e)
app.exit_code = 1
except CaughtSignal as e:
# Default Cement signals are SIGINT and SIGTERM, exit 0 (non-error)
print('CaughtSignal > %s' % e)
app.exit_code = 0
except FrameworkError as e:
# Catch framework errors and exit 1 (error)
print('FrameworkError > %s' % e)
app.exit_code = 1
finally:
# Print an exception (if it occurred) and --debug was passed
if app.debug:
@@ -122,10 +135,5 @@ def main():
traceback.print_exc()
def get_test_app(**kw):
app = WOApp(**kw)
return app
if __name__ == '__main__':
main()

View File

@@ -37,9 +37,8 @@ class WOCleanController(CementBaseController):
@expose(hide=True)
def default(self):
pargs = self.app.pargs
if (not (pargs.all or pargs.fastcgi
or pargs.opcache or
pargs.redis)):
if ((not pargs.all) and (not pargs.fastcgi) and
(not pargs.opcache) and (not pargs.redis)):
self.clean_fastcgi()
if pargs.all:
self.clean_fastcgi()
@@ -63,7 +62,8 @@ class WOCleanController(CementBaseController):
@expose(hide=True)
def clean_fastcgi(self):
if(os.path.isdir("/var/run/nginx-cache")):
if(os.path.isdir("/var/run/nginx-cache") and
os.path.exists('/usr/sbin/nginx')):
Log.info(self, "Cleaning NGINX FastCGI cache")
WOShellExec.cmd_exec(self, "rm -rf /var/run/nginx-cache/*")
WOService.restart_service(self, 'nginx')
@@ -72,6 +72,9 @@ class WOCleanController(CementBaseController):
@expose(hide=True)
def clean_opcache(self):
if (os.path.exists('/usr/sbin/nginx') and
os.path.exists(
'/var/www/22222/htdocs/cache/opcache/opgui.php')):
try:
Log.info(self, "Cleaning opcache")
opgui = requests.get(

View File

@@ -733,8 +733,11 @@ class WOSiteCreateController(CementBaseController):
Log.debug(self, "Going to issue Let's Encrypt certificate")
acmedata = dict(acme_domains, dns=False, acme_dns='dns_cf',
dnsalias=False, acme_alias='', keylength='')
acmedata['keylength'] = self.app.config.get('letsencrypt',
'keylength')
if self.app.config.has_section('letsencrypt'):
acmedata['keylength'] = self.app.config.get(
'letsencrypt', 'keylength')
else:
acmedata['keylength'] = 'ec-384'
if pargs.dns:
Log.debug(self, "DNS validation enabled")
acmedata['dns'] = True
@@ -813,11 +816,11 @@ class WOSiteCreateController(CementBaseController):
if WOAcme.setupletsencrypt(
self, acme_domains, acmedata):
WOAcme.deploycert(self, wo_domain)
httpsRedirect(self, wo_domain, True, acme_wildcard)
if pargs.hsts:
SSL.setuphsts(self, wo_domain)
httpsRedirect(self, wo_domain, True, acme_wildcard)
SSL.siteurlhttps(self, wo_domain)
if not WOService.reload_service(self, 'nginx'):
Log.error(self, "service nginx reload failed. "
@@ -1594,7 +1597,7 @@ class WOSiteUpdateController(CementBaseController):
"check issues with `nginx -t` command")
updateSiteInfo(self, wo_domain, stype=stype, cache=cache,
ssl=True if check_site.is_ssl else False,
ssl=(bool(check_site.is_ssl)),
php_version=check_php_version)
Log.info(self, "Successfully updated site"
@@ -1973,7 +1976,10 @@ class WOSiteDeleteController(CementBaseController):
if wo_site_type in ['mysql', 'wp', 'wpsubdir', 'wpsubdomain']:
wo_db_name = check_site.db_name
wo_db_user = check_site.db_user
if self.app.config.has_section('mysql'):
wo_mysql_grant_host = self.app.config.get('mysql', 'grant-host')
else:
wo_mysql_grant_host = 'localhost'
if wo_db_name == 'deleted':
mark_db_deleted = True
if pargs.all:

View File

@@ -149,9 +149,15 @@ def setupdatabase(self, data):
string.ascii_lowercase +
string.digits, 24)))
wo_replace_dot = wo_domain_name.replace('.', '')
if self.app.config.has_section('mysql'):
prompt_dbname = self.app.config.get('mysql', 'db-name')
prompt_dbuser = self.app.config.get('mysql', 'db-user')
wo_mysql_grant_host = self.app.config.get('mysql', 'grant-host')
else:
prompt_dbname = False
prompt_dbuser = False
wo_mysql_grant_host = 'localhost'
wo_db_name = ''
wo_db_username = ''
wo_db_password = ''
@@ -165,7 +171,7 @@ def setupdatabase(self, data):
if not wo_db_name:
wo_db_name = wo_replace_dot
wo_db_name = (wo_db_name[0:8] + generate_random())
wo_db_name = (wo_db_name[0:16] + generate_random())
if prompt_dbuser == 'True' or prompt_dbuser == 'true':
try:
@@ -179,7 +185,7 @@ def setupdatabase(self, data):
if not wo_db_username:
wo_db_username = wo_replace_dot
wo_db_username = (wo_db_name[0:8] + generate_random())
wo_db_username = (wo_db_name[0:12] + generate_random())
if not wo_db_password:
wo_db_password = wo_random_pass
@@ -189,8 +195,8 @@ def setupdatabase(self, data):
try:
if WOMysql.check_db_exists(self, wo_db_name):
Log.debug(self, "Database already exists, Updating DB_NAME .. ")
wo_db_name = (wo_db_name[0:8] + generate_random())
wo_db_username = (wo_db_name[0:8] + generate_random())
wo_db_name = (wo_db_name[0:16] + generate_random())
wo_db_username = (wo_db_name[0:12] + generate_random())
except MySQLConnectionError:
raise SiteError("MySQL Connectivity problem occured")
@@ -237,10 +243,16 @@ def setupdatabase(self, data):
def setupwordpress(self, data, vhostonly=False):
wo_domain_name = data['site_name']
wo_site_webroot = data['webroot']
if self.app.config.has_section('wordpress'):
prompt_wpprefix = self.app.config.get('wordpress', 'prefix')
wo_wp_user = self.app.config.get('wordpress', 'user')
wo_wp_pass = self.app.config.get('wordpress', 'password')
wo_wp_email = self.app.config.get('wordpress', 'email')
else:
prompt_wpprefix = False
wo_wp_user = ''
wo_wp_pass = ''
wo_wp_email = ''
# Random characters
wo_random_pass = (''.join(random.sample(string.ascii_uppercase +
string.ascii_lowercase +
@@ -380,10 +392,7 @@ def setupwordpress(self, data, vhostonly=False):
for wp_conf in wp_conf_variables:
wp_var = wp_conf[0]
wp_val = wp_conf[1]
if wp_val == 'true' or wp_val == 'false':
var_raw = True
else:
var_raw = False
var_raw = (bool(wp_val == 'true' or wp_val == 'false'))
try:
WOShellExec.cmd_exec(
self, "/bin/bash -c \"{0} --allow-root "
@@ -1195,7 +1204,7 @@ def generate_random_pass():
def generate_random():
wo_random10 = (''.join(random.sample(string.ascii_uppercase +
string.ascii_lowercase +
string.digits, 8)))
string.digits, 4)))
return wo_random10

View File

@@ -124,7 +124,7 @@ class WOStackController(CementBaseController):
(not pargs.cheat) and (not pargs.nanorc) and
(not pargs.ufw) and (not pargs.ngxblocker) and
(not pargs.phpredisadmin) and (not pargs.sendmail) and
(not pargs.php73)):
(not pargs.php73) and (not pargs.all)):
pargs.web = True
pargs.admin = True
pargs.fail2ban = True
@@ -563,7 +563,7 @@ class WOStackController(CementBaseController):
(not pargs.cheat) and (not pargs.nanorc) and
(not pargs.ufw) and (not pargs.ngxblocker) and
(not pargs.phpredisadmin) and (not pargs.sendmail) and
(not pargs.php73)):
(not pargs.php73) and (not pargs.all)):
self.app.args.print_help()
if pargs.all:
@@ -849,7 +849,7 @@ class WOStackController(CementBaseController):
(not pargs.cheat) and (not pargs.nanorc) and
(not pargs.ufw) and (not pargs.ngxblocker) and
(not pargs.phpredisadmin) and (not pargs.sendmail) and
(not pargs.php73)):
(not pargs.php73) and (not pargs.all)):
self.app.args.print_help()
if pargs.all:

View File

@@ -29,8 +29,8 @@ def pre_pref(self, apt_packages):
# add mariadb repository excepted on raspbian and ubuntu 19.04
if (not WOVar.wo_distro == 'raspbian'):
Log.info(self, "Adding repository for MySQL, please wait...")
mysql_pref = ("Package: *\nPin: origin "
"sfo1.mirrors.digitalocean.com"
mysql_pref = (
"Package: *\nPin: origin mariadb.mirrors.ovh.net"
"\nPin-Priority: 1000\n")
with open('/etc/apt/preferences.d/'
'MariaDB.pref', 'w') as mysql_pref_file:
@@ -215,24 +215,23 @@ def post_pref(self, apt_packages, packages, upgrade=False):
self, '{0}/upstream.conf'.format(ngxcnf),
'upstream.mustache', data, overwrite=True)
data = dict(phpconf=True if
WOAptGet.is_installed(self, 'php7.2-fpm')
else False)
WOTemplate.deploy(self,
'{0}/stub_status.conf'.format(ngxcnf),
data = dict(phpconf=(
bool(WOAptGet.is_installed(self, 'php7.2-fpm'))))
WOTemplate.deploy(
self, '{0}/stub_status.conf'.format(ngxcnf),
'stub_status.mustache', data)
data = dict()
WOTemplate.deploy(self,
'{0}/webp.conf'.format(ngxcnf),
WOTemplate.deploy(
self, '{0}/webp.conf'.format(ngxcnf),
'webp.mustache', data, overwrite=False)
WOTemplate.deploy(self,
'{0}/cloudflare.conf'.format(ngxcnf),
WOTemplate.deploy(
self, '{0}/cloudflare.conf'.format(ngxcnf),
'cloudflare.mustache', data)
WOTemplate.deploy(self,
'{0}/map-wp-fastcgi-cache.conf'.format(
ngxcnf),
WOTemplate.deploy(
self,
'{0}/map-wp-fastcgi-cache.conf'.format(ngxcnf),
'map-wp.mustache', data)
except CommandExecutionError as e:
Log.debug(self, "{0}".format(e))
@@ -1401,13 +1400,14 @@ def post_pref(self, apt_packages, packages, upgrade=False):
Log.debug(self, "{0}".format(e))
Log.error(self, "failed to configure Anemometer",
exit=False)
if self.app.config.has_section('mysql'):
wo_grant_host = self.app.config.get('mysql', 'grant-host')
else:
wo_grant_host = 'localhost'
WOMysql.execute(self, 'grant select on'
' *.* to \'anemometer\''
'@\'{0}\' IDENTIFIED'
' BY \'{1}\''.format(self.app.config.get
('mysql',
'grant-host'),
' BY \'{1}\''.format(wo_grant_host,
chars))
Log.debug(self, "grant all on slow-query-log.*"
" to anemometer@root_user"
@@ -1447,9 +1447,23 @@ def post_pref(self, apt_packages, packages, upgrade=False):
def pre_stack(self):
"""Inital server configuration and tweak"""
# remove old sysctl tweak
if os.path.isfile('/etc/sysctl.d/60-ubuntu-nginx-web-server.conf'):
WOFileUtils.rm(
self, '/etc/sysctl.d/60-ubuntu-nginx-web-server.conf')
# check if version.txt exist
if os.path.exists('/var/lib/wo/version.txt'):
with open('/var/lib/wo/version.txt',
mode='r', encoding='utf-8') as wo_ver:
# check version written in version.txt
wo_check = bool(wo_ver.read().strip() ==
'{0}'.format(WOVar.wo_version))
else:
wo_check = False
if wo_check is False:
# wo sysctl tweaks
# check system type
wo_arch = os.uname()[4]
wo_arch = bool(os.uname()[4] == 'x86_x64')
if os.path.isfile('/proc/1/environ'):
# detect lxc containers
wo_lxc = WOFileUtils.grepcheck(
@@ -1460,12 +1474,8 @@ def pre_stack(self):
else:
wo_wsl = True
wo_lxc = True
# remove old sysctl tweak
if os.path.isfile('/etc/sysctl.d/60-ubuntu-nginx-web-server.conf'):
WOFileUtils.rm(self, '/etc/sysctl.d/60-ubuntu-nginx-web-server.conf')
if wo_arch == 'x86_64':
if (wo_lxc is not True) and (wo_wsl is not True):
if (wo_lxc is not True) and (wo_wsl is not True) and (wo_arch is True):
data = dict()
WOTemplate.deploy(
self, '/etc/sysctl.d/60-wo-tweaks.conf',
@@ -1474,27 +1484,43 @@ def pre_stack(self):
if (WOVar.wo_platform_codename == 'bionic' or
WOVar.wo_platform_codename == 'disco' or
WOVar.wo_platform_codename == 'buster'):
if WOShellExec.cmd_exec(self, 'modprobe tcp_bbr'):
with open("/etc/modules-load.d/bbr.conf",
try:
WOShellExec.cmd_exec(
self, 'modprobe tcp_bbr')
with open(
"/etc/modules-load.d/bbr.conf",
encoding='utf-8', mode='w') as bbr_file:
bbr_file.write('tcp_bbr')
with open("/etc/sysctl.d/60-wo-tweaks.conf",
with open(
"/etc/sysctl.d/60-wo-tweaks.conf",
encoding='utf-8', mode='a') as sysctl_file:
sysctl_file.write(
'\nnet.ipv4.tcp_congestion_control = bbr'
'\nnet.ipv4.tcp_notsent_lowat = 16384')
except OSError as e:
Log.debug(self, str(e))
Log.warn(self, "failed to tweak sysctl")
else:
if WOShellExec.cmd_exec(self, 'modprobe tcp_htcp'):
with open("/etc/modules-load.d/htcp.conf",
try:
WOShellExec.cmd_exec(
self, 'modprobe tcp_htcp')
with open(
"/etc/modules-load.d/htcp.conf",
encoding='utf-8', mode='w') as bbr_file:
bbr_file.write('tcp_htcp')
with open("/etc/sysctl.d/60-wo-tweaks.conf",
with open(
"/etc/sysctl.d/60-wo-tweaks.conf",
encoding='utf-8', mode='a') as sysctl_file:
sysctl_file.write(
'\nnet.ipv4.tcp_congestion_control = htcp')
except OSError as e:
Log.debug(self, str(e))
Log.warn(self, "failed to tweak sysctl")
# apply sysctl tweaks
WOShellExec.cmd_exec(
self, 'sysctl -eq -p /etc/sysctl.d/60-wo-tweaks.conf')
# sysctl tweak service
data = dict()
if not os.path.isfile('/opt/wo-kernel.sh'):
@@ -1507,9 +1533,10 @@ def pre_stack(self):
WOShellExec.cmd_exec(self, 'systemctl enable wo-kernel.service')
WOService.start_service(self, 'wo-kernel')
# open_files_limit tweak
if not WOFileUtils.grepcheck(self, '/etc/security/limits.conf', '500000'):
if not WOFileUtils.grepcheck(self,
'/etc/security/limits.conf', '500000'):
with open("/etc/security/limits.conf",
encoding='utf-8', mode='w') as limit_file:
encoding='utf-8', mode='a') as limit_file:
limit_file.write(
'* hard nofile 500000\n'
'* soft nofile 500000\n'
@@ -1519,13 +1546,12 @@ def pre_stack(self):
data = dict()
# check if update-motd.d directory exist
if os.path.isdir('/etc/update-motd.d/'):
if not os.path.isfile('/etc/update-motd.d/98-wo-update'):
# render custom motd template
WOTemplate.deploy(
self, '/etc/update-motd.d/98-wo-update',
'wo-update.mustache', data)
WOFileUtils.chmod(
self, "/etc/update-motd.d/98-wo-update", 0o755)
# restart motd-news service if available
if os.path.isfile('/lib/systemd/system/motd-news.service'):
WOService.restart_service(self, 'motd-news')
with open('/var/lib/wo/version.txt',
mode='w', encoding='utf-8') as wo_ver:
wo_ver.write('{0}'.format(WOVar.wo_version))

View File

@@ -65,9 +65,10 @@ class WOUpdateController(CementBaseController):
wo_current = ("v{0}".format(WOVar.wo_version))
wo_latest = WODownload.latest_release(self, "WordOps/WordOps")
if wo_current == wo_latest:
Log.error(
Log.info(
self, "WordOps {0} is already installed"
.format(wo_latest))
self.app.close(0)
if not os.path.isdir('/var/lib/wo/tmp'):
os.makedirs('/var/lib/wo/tmp')

View File

@@ -47,7 +47,7 @@ location /wp-content/uploads {
expires max;
try_files $uri$webp_suffix $uri =404;
}
location ~* \.(php|gz|log|zip|tar|rar)$ {
location ~* \.(php|gz|log|zip|tar|rar|xz)$ {
#Prevent Direct Access Of PHP Files & BackupsFrom Web Browsers
deny all;
}

View File

@@ -58,7 +58,8 @@ class WOAcme:
if acmedata['dns'] is True:
Log.error(
self, "Please make sure your properly "
"set your DNS API credentials for acme.sh")
"set your DNS API credentials for acme.sh\n"
"If you are using sudo, use \"sudo -E wo\"")
return False
else:
Log.error(
@@ -145,10 +146,19 @@ class WOAcme:
def check_dns(self, acme_domains):
"""Check if a list of domains point to the server IP"""
server_ip = requests.get('http://v4.wordops.eu/').text
server_ip = requests.get('https://v4.wordops.eu/').text
for domain in acme_domains:
domain_ip = requests.get('http://v4.wordops.eu/dns/{0}/'
.format(domain)).text
url = (
"https://cloudflare-dns.com/dns-query?name={0}&type=A"
.format(domain))
headers = {
'accept': 'application/dns-json'
}
try:
response = requests.get(url, headers=headers).json()
domain_ip = response["Answer"][0]['data']
except requests.RequestException:
Log.error(self, 'Resolving domain IP failed')
if(not domain_ip == server_ip):
Log.warn(
self, "{0}".format(domain) +

View File

@@ -14,7 +14,7 @@ class WOVar():
"""Intialization of core variables"""
# WordOps version
wo_version = "3.10.2"
wo_version = "3.10.3"
# WordOps packages versions
wo_wp_cli = "2.3.0"
wo_adminer = "4.7.3"
@@ -170,15 +170,16 @@ class WOVar():
wo_clamav = ["clamav", "clamav-freshclam"]
wo_ubuntu_backports = 'ppa:jonathonf/backports'
# Redis repo details
# APT repositories
wo_mysql_repo = ("deb [arch=amd64,ppc64el] "
"http://mariadb.mirrors.ovh.net/MariaDB/repo/"
"10.3/{distro} {codename} main"
.format(distro=wo_distro,
codename=wo_platform_codename))
if wo_distro == 'ubuntu':
wo_php_repo = "ppa:ondrej/php"
wo_redis_repo = ("ppa:chris-lea/redis-server")
wo_goaccess_repo = ("ppa:alex-p/goaccess")
wo_mysql_repo = ("deb [arch=amd64,ppc64el] "
"http://mariadb.mirrors.ovh.net/MariaDB/repo/"
"10.3/ubuntu {codename} main"
.format(codename=wo_platform_codename))
else:
wo_php_repo = (
@@ -187,10 +188,6 @@ class WOVar():
wo_php_key = 'AC0E47584A7A714D'
wo_redis_repo = ("deb https://packages.sury.org/php/ {codename} all"
.format(codename=wo_platform_codename))
wo_mysql_repo = ("deb [arch=amd64,ppc64el] "
"http://mariadb.mirrors.ovh.net/MariaDB/repo/"
"10.3/debian {codename} main"
.format(codename=wo_platform_codename))
wo_redis = ['redis-server']

View File

@@ -1,9 +1,9 @@
"""Testing utilities for WordOps"""
from cement.utils.test import *
from cement.utils import test
from wo.cli.main import WOTestApp
class WOTestCase(CementTestCase):
class WOTestCase(test.CementTestCase):
app_class = WOTestApp
def setUp(self):