Merge pull request #127 from WordOps/updating-configuration

Updating configuration
This commit is contained in:
VirtuBox
2019-08-28 01:31:01 +02:00
committed by GitHub
24 changed files with 851 additions and 458 deletions

View File

@@ -1,13 +1,14 @@
This issue tracker is only for issues related to WordOps. This issue tracker is only for issues directly related to WordOps.
Please use <https://community.wordops.net> for support questions. Please use <https://community.wordops.net> for support questions.
If you feel the issue is a WordOps specific issue, please attach the output of the following commands. If you feel the issue is a WordOps specific issue, please attach the output of the following commands.
System Information System Information
- [ ] lsb_release -a - [ ] `lsb_release -a`
- [ ] wo info - [ ] `wo info`
- [ ] nginx -V - [ ] `nginx -V`
- [ ] wo -v - [ ] `wo -v`
- [ ] wp cli info --allow-root - [ ] `wp cli info --allow-root`
- [ ] `curl -sL git.io/fjAp3 | sudo -E bash -`

View File

@@ -8,6 +8,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
### v3.9.x - [Unreleased] ### v3.9.x - [Unreleased]
### v3.9.8.4 - 2019-08-28
#### Added
- cht.sh stack : linux online cheatsheet. Usage : `cheat <command>`. Example for tar : `cheat tar`
- ClamAV anti-virus with weekly cronjob to update signatures database
- Internal function to add daily cronjobs
- Additional comment to detect previous configuration tuning (MariaDB & Redis)
- Domain/Subdomain detection based on public domain suffixes list for letsencrypt
- Increase Nginx & MariaDB systemd open_files limits
- Cronjob to update Cloudflare IPs list
- mariadb-backup to perform full and non-blocking databases backup (installation only. Backup feature will be available soon)
- Nginx configuration check before performing start/reload/restart (If configuration check fail, WordOps will not reload/restart Nginx anymore)
- Nginx mapping to proxy web-socket connections
#### Changed
- eXplorer filemanager isn't installed with WordOps dashboard anymore, and a flag `--extplorer` is available. But it's still installed when running the command `wo stack install`
- Template rendering function now check for a .custom file before overwriting a configuration by default.
- flag `--letsencrypt=subdomain` is not required anymore, you can use `--letsencrypt` or `-le`
- Simplifiy and decrease duration of `apt-key` GPG keys import
#### Fixed
- typo error in `wo site update` : [PR #126](https://github.com/WordOps/WordOps/pull/126)
### v3.9.8.3 - 2019-08-21 ### v3.9.8.3 - 2019-08-21
#### Changed #### Changed

View File

@@ -67,6 +67,7 @@
- Debian 9 (Stretch) - Debian 9 (Stretch)
- Debian 10 (Buster) - Not ready for production - Debian 10 (Buster) - Not ready for production
- Raspbian 9 (Stretch) - Raspbian 9 (Stretch)
- Raspbian 10 (Buster) - Testing
## Getting Started ## Getting Started

49
install
View File

@@ -9,7 +9,7 @@
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# wget -qO wo wops.cc && sudo bash wo # wget -qO wo wops.cc && sudo bash wo
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Version 3.9.8.3 - 2019-08-20 # Version 3.9.8.4 - 2019-08-28
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# CONTENTS # CONTENTS
@@ -494,6 +494,7 @@ wo_upgrade_nginx() {
# install new nginx package # install new nginx package
if [ -n "$CHECK_NGINX_EE" ]; then if [ -n "$CHECK_NGINX_EE" ]; then
if [ -x /usr/local/bin/wo ]; then if [ -x /usr/local/bin/wo ]; then
[ -f /etc/apt/preferences.d/nginx-block ] && { mv /etc/apt/preferences.d/nginx-block /var/lib/wo/tmp/nginx-block; }
# stop nginx # stop nginx
service nginx stop service nginx stop
# remove previous package # remove previous package
@@ -544,6 +545,7 @@ wo_upgrade_nginx() {
systemctl stop nginx systemctl stop nginx
systemctl start nginx systemctl start nginx
fi fi
[ -f /var/lib/wo/tmp/nginx-block ] && { mv /var/lib/wo/tmp/nginx-block /etc/apt/preferences.d/nginx-block; }
} \ } \
>> "$wo_install_log" 2>&1 >> "$wo_install_log" 2>&1
@@ -653,7 +655,6 @@ wo_tweak_kernel() {
# apply sysctl tweaks # apply sysctl tweaks
sysctl -eq -p /etc/sysctl.d/60-wo-tweaks.conf sysctl -eq -p /etc/sysctl.d/60-wo-tweaks.conf
fi fi
} }
wo_systemd_tweak() { wo_systemd_tweak() {
@@ -676,6 +677,35 @@ wo_systemd_tweak() {
} }
wo_domain_suffix() {
curl -sL https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat | sed '/^\/\//d' | sed '/^$/d' | sed 's/^\s+//g' > /var/lib/wo/public_suffix_list.dat
}
wo_mariadb_tweak() {
# increase mariadb open_files_limit
{
if [ -d /etc/systemd/system/mariadb.service.d ] && [ ! -f /etc/systemd/system/mariadb.service.d/limits.conf ]; then
echo -e '[Service]\nLimitNOFILE=500000' > /etc/systemd/system/mariadb.service.d/limits.conf
systemctl daemon-reload
service mysql restart
fi
} >> /var/log/wo/install.log 2>&1
}
wo_nginx_tweak() {
# increase nginx open_files_limit
{
if [ ! -d /etc/systemd/system/nginx.service.d ]; then
mkdir -p /etc/systemd/system/nginx.service.d
if [ ! -f /etc/systemd/system/nginx.service.d/limits.conf ]; then
echo -e '[Service]\nLimitNOFILE=500000' > /etc/systemd/system/nginx.service.d/limits.conf
systemctl daemon-reload
nginx -t && service nginx restart
fi
fi
} >> /var/log/wo/install.log 2>&1
}
wo_clean() { wo_clean() {
rm -rf /usr/local/lib/python3.*/dist-packages/wo-* rm -rf /usr/local/lib/python3.*/dist-packages/wo-*
} }
@@ -792,6 +822,13 @@ else
wo_lib_echo "Adding systemd service tweak" | tee -ai $wo_install_log wo_lib_echo "Adding systemd service tweak" | tee -ai $wo_install_log
wo_systemd_tweak | tee -ai $wo_install_log wo_systemd_tweak | tee -ai $wo_install_log
fi fi
if [ -x /usr/sbin/nginx ]; then
wo_nginx_tweak | tee -ai $wo_install_log
fi
if [ -d /etc/systemd/system/mariadb.service.d ]; then
wo_mariadb_tweak | tee -ai $wo_install_log
fi
wo_domain_suffix | tee -ai $wo_install_log
wo_lib_echo "Running post-install steps " | tee -ai $wo_install_log wo_lib_echo "Running post-install steps " | tee -ai $wo_install_log
wo_update_wp_cli | tee -ai $wo_install_log wo_update_wp_cli | tee -ai $wo_install_log
else else
@@ -834,6 +871,13 @@ else
wo_lib_echo "Adding systemd service tweak" | tee -ai $wo_install_log wo_lib_echo "Adding systemd service tweak" | tee -ai $wo_install_log
wo_systemd_tweak | tee -ai $wo_install_log wo_systemd_tweak | tee -ai $wo_install_log
fi fi
if [ -x /usr/sbin/nginx ]; then
wo_nginx_tweak | tee -ai $wo_install_log
fi
if [ -d /etc/systemd/system/mariadb.service.d ]; then
wo_mariadb_tweak | tee -ai $wo_install_log
fi
wo_domain_suffix | tee -ai $wo_install_log
wo_lib_echo "Running post-install steps " | tee -ai $wo_install_log wo_lib_echo "Running post-install steps " | tee -ai $wo_install_log
wo_git_init | tee -ai $wo_install_log wo_git_init | tee -ai $wo_install_log
wo_update_wp_cli | tee -ai $wo_install_log wo_update_wp_cli | tee -ai $wo_install_log
@@ -871,6 +915,7 @@ else
wo_install_acme_sh | tee -ai $wo_install_log wo_install_acme_sh | tee -ai $wo_install_log
wo_lib_echo "Running post-install steps " | tee -ai $wo_install_log wo_lib_echo "Running post-install steps " | tee -ai $wo_install_log
secure_wo_db | tee -ai $wo_install_log secure_wo_db | tee -ai $wo_install_log
wo_domain_suffix | tee -ai $wo_install_log
wo_git_init | tee -ai $wo_install_log wo_git_init | tee -ai $wo_install_log
wo_update_wp_cli | tee -ai $wo_install_log wo_update_wp_cli | tee -ai $wo_install_log
fi fi

View File

@@ -57,7 +57,7 @@ if not os.path.isfile('/root/.gitconfig'):
shutil.copy2(os.path.expanduser("~")+'/.gitconfig', '/root/.gitconfig') shutil.copy2(os.path.expanduser("~")+'/.gitconfig', '/root/.gitconfig')
setup(name='wo', setup(name='wo',
version='3.9.8.3', version='3.9.8.4',
description=long_description, description=long_description,
long_description=long_description, long_description=long_description,
classifiers=[], classifiers=[],

26
tests/issue.sh Normal file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------
# WordOps support script
# -------------------------------------------------------------------------
# Website: https://wordops.net
# GitHub: https://github.com/WordOps/WordOps
# Copyright (c) 2019 - WordOps
# This script is licensed under M.I.T
# -------------------------------------------------------------------------
# curl -sL git.io/fjAp3 | sudo -E bash -
# -------------------------------------------------------------------------
# Version 3.9.8.4 - 2019-08-28
# -------------------------------------------------------------------------
if [ -f /var/log/wo/wordops.log ]; then
cd /var/log/wo/ || exit 1
if {
tar -I pigz -cf wordops.tar.gz wordops.log
}; then
wo_link=$(curl -sL --upload-file wordops.tar.gz https://transfer.sh/wordops.tar.gz)
echo
echo "Here the link to provide in your github issue : $wo_link"
echo
fi
cd || exit 1
fi

View File

@@ -3,6 +3,9 @@
# WordOps travis testing script # WordOps travis testing script
# #
# #
CSI='\033['
CEND="${CSI}0m"
CGREEN="${CSI}1;32m"
exit_script() { exit_script() {
tar -I pigz -cf wordops.tar.gz /var/log/wo tar -I pigz -cf wordops.tar.gz /var/log/wo
@@ -16,26 +19,38 @@ if ! {
exit_script exit_script
fi fi
if ! { if ! {
echo -e "${CGREEN}#############################################${CEND}"
echo -e ' Simple site create '
echo -e "${CGREEN}#############################################${CEND}"
wo site create html.net --html && wo site create php.com --php && wo site create mysql.com --mysql && wo site create proxy.com --proxy=127.0.0.1:3000 wo site create html.net --html && wo site create php.com --php && wo site create mysql.com --mysql && wo site create proxy.com --proxy=127.0.0.1:3000
wo site create wp1.com --wp && wo site create wpsc1.net --wpsc && wo site create wpfc1.com --wpfc wo site create wp1.com --wp && wo site create wpsc1.net --wpsc && wo site create wpfc1.com --wpfc
wo site create wpsc-php73.net --wpsc --php73 && wo site create wpfc-php73.net --wpfc --php73 wo site create wpsc-php73.net --wpsc --php73 && wo site create wpfc-php73.net --wpfc --php73
wo site create wprocket.net --wprocket && wo site create wprocket-php73.net --wprocket --php73 wo site create wprocket.net --wprocket && wo site create wprocket-php73.net --wprocket --php73
wo site create wpce.net --wpce && wo site create wpce-php73.net --wpce --php73 wo site create wpce.net --wpce && wo site create wpce-php73.net --wpce --php73
wo site create wpredis.net --wpredis && wo site create wpredis-php73.net --wpredis --php73 wo site create wpredis.net --wpredis && wo site create wpredis-php73.net --wpredis --php73
wo site create wpsubdir1.com --wpsubdir && wo site create wpsubdir-php73.com --wpsubdir --php73
}; then }; then
exit_script exit_script
fi fi
if ! { if ! {
echo -e "${CGREEN}#############################################${CEND}"
echo -e ' Multi-site create '
echo -e "${CGREEN}#############################################${CEND}"
wo site create wpsubdir1.com --wpsubdir && wo site create wpsubdir-php73.com --wpsubdir --php73
wo site create wpsubdirwpsc1.com --wpsubdir --wpsc && wo site create wpsubdirwpsc2.com --wpsubdir --wpfc && wo site create wpsubdirwpsc1-php73.com --wpsubdir --wpsc --php73 && wo site create wpsubdirwpsc2-php73.com --wpsubdir --wpfc --php73 wo site create wpsubdirwpsc1.com --wpsubdir --wpsc && wo site create wpsubdirwpsc2.com --wpsubdir --wpfc && wo site create wpsubdirwpsc1-php73.com --wpsubdir --wpsc --php73 && wo site create wpsubdirwpsc2-php73.com --wpsubdir --wpfc --php73
wo site create wpsubdomain1.com --wpsubdomain && wo site create wpsubdomain1-php73.com --wpsubdomain --php73 && wo site create wpsubdomainwpsc.org --wpsubdomain --wpsc && wo site create wpsubdomainwpfc.org --wpsubdomain --wpfc && wo site create wpsubdomainwpfc2.in --wpfc --wpsubdomain wo site create wpsubdomain1.com --wpsubdomain && wo site create wpsubdomain1-php73.com --wpsubdomain --php73 && wo site create wpsubdomainwpsc.org --wpsubdomain --wpsc && wo site create wpsubdomainwpfc.org --wpsubdomain --wpfc && wo site create wpsubdomainwpfc2.in --wpfc --wpsubdomain
echo -e "${CGREEN}#############################################${CEND}"
echo -e ' wo site update '
echo -e "${CGREEN}#############################################${CEND}"
wo site create 1.com --html && wo site create 2.com --php && wo site create 3.com --mysql wo site create 1.com --html && wo site create 2.com --php && wo site create 3.com --mysql
wo site update 1.com --wp && wo site update 2.com --php73 && wo site update 3.com --php73 && wo site update 1.com --wpfc && wo site update 1.com --wpsc && wo site update 1.com --wpredis wo site update 1.com --wp && wo site update 2.com --php73 && wo site update 3.com --php73 && wo site update 1.com --wpfc && wo site update 1.com --wpsc && wo site update 1.com --wpredis
}; then }; then
exit_script exit_script
fi fi
if ! { if ! {
echo -e "${CGREEN}#############################################${CEND}"
echo -e ' wo stack upgrade '
echo -e "${CGREEN}#############################################${CEND}"
wo stack upgrade --force wo stack upgrade --force
wo stack upgrade --php --force wo stack upgrade --php --force
wo stack upgrade --netdata --force wo stack upgrade --netdata --force
@@ -45,7 +60,9 @@ if ! {
}; then }; then
exit_script exit_script
fi fi
echo -e "${CGREEN}#############################################${CEND}"
echo -e ' various informations '
echo -e "${CGREEN}#############################################${CEND}"
wp --allow-root --info wp --allow-root --info
cat /etc/nginx/nginx.conf cat /etc/nginx/nginx.conf
wo site info wp1.com wo site info wp1.com

View File

@@ -4,7 +4,7 @@ from cement.core import handler, hook
from wo.core.sslutils import SSL from wo.core.sslutils import SSL
from wo.core.variables import WOVariables from wo.core.variables import WOVariables
from wo.core.shellexec import WOShellExec from wo.core.shellexec import WOShellExec
from wo.core.domainvalidate import ValidateDomain from wo.core.domainvalidate import ValidateDomain, GetDomainlevel
from wo.core.fileutils import WOFileUtils from wo.core.fileutils import WOFileUtils
from wo.cli.plugins.site_functions import * from wo.cli.plugins.site_functions import *
from wo.core.services import WOService from wo.core.services import WOService
@@ -45,18 +45,19 @@ class WOSiteController(CementBaseController):
@expose(help="Enable site example.com") @expose(help="Enable site example.com")
def enable(self): def enable(self):
if not self.app.pargs.site_name: pargs = self.app.pargs
if not pargs.site_name:
try: try:
while not self.app.pargs.site_name: while not pargs.site_name:
self.app.pargs.site_name = (input('Enter site name : ') pargs.site_name = (input('Enter site name : ')
.strip()) .strip())
except IOError as e: except IOError as e:
Log.debug(self, str(e)) Log.debug(self, str(e))
Log.error(self, 'could not input site name') Log.error(self, 'could not input site name')
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
# validate domain name # validate domain name
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) (wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
# check if site exists # check if site exists
if not check_domain_exists(self, wo_domain): if not check_domain_exists(self, wo_domain):
@@ -83,17 +84,18 @@ class WOSiteController(CementBaseController):
@expose(help="Disable site example.com") @expose(help="Disable site example.com")
def disable(self): def disable(self):
if not self.app.pargs.site_name: pargs = self.app.pargs
if not pargs.site_name:
try: try:
while not self.app.pargs.site_name: while not pargs.site_name:
self.app.pargs.site_name = (input('Enter site name : ') pargs.site_name = (input('Enter site name : ')
.strip()) .strip())
except IOError as e: except IOError as e:
Log.debug(self, str(e)) Log.debug(self, str(e))
Log.error(self, 'could not input site name') Log.error(self, 'could not input site name')
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) (wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
# check if site exists # check if site exists
if not check_domain_exists(self, wo_domain): if not check_domain_exists(self, wo_domain):
Log.error(self, "site {0} does not exist".format(wo_domain)) Log.error(self, "site {0} does not exist".format(wo_domain))
@@ -124,16 +126,18 @@ class WOSiteController(CementBaseController):
@expose(help="Get example.com information") @expose(help="Get example.com information")
def info(self): def info(self):
if not self.app.pargs.site_name: pargs = self.app.pargs
if not pargs.site_name:
try: try:
while not self.app.pargs.site_name: while not pargs.site_name:
self.app.pargs.site_name = (input('Enter site name : ') pargs.site_name = (input('Enter site name : ')
.strip()) .strip())
except IOError as e: except IOError as e:
Log.debug(self, str(e)) Log.debug(self, str(e))
Log.error(self, 'could not input site name') Log.error(self, 'could not input site name')
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) (wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
wo_domain_type, wo_root_domain = GetDomainlevel(wo_domain)
wo_db_name = '' wo_db_name = ''
wo_db_user = '' wo_db_user = ''
wo_db_pass = '' wo_db_pass = ''
@@ -143,7 +147,6 @@ class WOSiteController(CementBaseController):
if os.path.isfile('/etc/nginx/sites-available/{0}' if os.path.isfile('/etc/nginx/sites-available/{0}'
.format(wo_domain)): .format(wo_domain)):
siteinfo = getSiteInfo(self, wo_domain) siteinfo = getSiteInfo(self, wo_domain)
sitetype = siteinfo.site_type sitetype = siteinfo.site_type
cachetype = siteinfo.cache_type cachetype = siteinfo.cache_type
wo_site_webroot = siteinfo.site_path wo_site_webroot = siteinfo.site_path
@@ -179,8 +182,9 @@ class WOSiteController(CementBaseController):
@expose(help="Monitor example.com logs") @expose(help="Monitor example.com logs")
def log(self): def log(self):
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs = self.app.pargs
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
wo_site_webroot = getSiteInfo(self, wo_domain).site_path wo_site_webroot = getSiteInfo(self, wo_domain).site_path
if not check_domain_exists(self, wo_domain): if not check_domain_exists(self, wo_domain):
@@ -191,17 +195,18 @@ class WOSiteController(CementBaseController):
@expose(help="Display Nginx configuration of example.com") @expose(help="Display Nginx configuration of example.com")
def show(self): def show(self):
if not self.app.pargs.site_name: pargs = self.app.pargs
if not pargs.site_name:
try: try:
while not self.app.pargs.site_name: while not pargs.site_name:
self.app.pargs.site_name = (input('Enter site name : ') pargs.site_name = (input('Enter site name : ')
.strip()) .strip())
except IOError as e: except IOError as e:
Log.debug(self, str(e)) Log.debug(self, str(e))
Log.error(self, 'could not input site name') Log.error(self, 'could not input site name')
# TODO Write code for wo site edit command here # TODO Write code for wo site edit command here
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) (wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
if not check_domain_exists(self, wo_domain): if not check_domain_exists(self, wo_domain):
Log.error(self, "site {0} does not exist".format(wo_domain)) Log.error(self, "site {0} does not exist".format(wo_domain))
@@ -221,17 +226,18 @@ class WOSiteController(CementBaseController):
@expose(help="Change directory to site webroot") @expose(help="Change directory to site webroot")
def cd(self): def cd(self):
if not self.app.pargs.site_name: pargs = self.app.pargs
if not pargs.site_name:
try: try:
while not self.app.pargs.site_name: while not pargs.site_name:
self.app.pargs.site_name = (input('Enter site name : ') pargs.site_name = (input('Enter site name : ')
.strip()) .strip())
except IOError as e: except IOError as e:
Log.debug(self, str(e)) Log.debug(self, str(e))
Log.error(self, 'Unable to read input, please try again') Log.error(self, 'Unable to read input, please try again')
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) (wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
if not check_domain_exists(self, wo_domain): if not check_domain_exists(self, wo_domain):
Log.error(self, "site {0} does not exist".format(wo_domain)) Log.error(self, "site {0} does not exist".format(wo_domain))
@@ -261,17 +267,18 @@ class WOSiteEditController(CementBaseController):
@expose(hide=True) @expose(hide=True)
def default(self): def default(self):
if not self.app.pargs.site_name: pargs = self.app.pargs
if not pargs.site_name:
try: try:
while not self.app.pargs.site_name: while not pargs.site_name:
self.app.pargs.site_name = (input('Enter site name : ') pargs.site_name = (input('Enter site name : ')
.strip()) .strip())
except IOError as e: except IOError as e:
Log.debug(self, str(e)) Log.debug(self, str(e))
Log.error(self, 'Unable to read input, Please try again') Log.error(self, 'Unable to read input, Please try again')
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) (wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
if not check_domain_exists(self, wo_domain): if not check_domain_exists(self, wo_domain):
Log.error(self, "site {0} does not exist".format(wo_domain)) Log.error(self, "site {0} does not exist".format(wo_domain))
@@ -381,43 +388,43 @@ class WOSiteCreateController(CementBaseController):
def default(self): def default(self):
pargs = self.app.pargs pargs = self.app.pargs
if pargs.php72: if pargs.php72:
self.app.pargs.php = True pargs.php = True
# self.app.render((data), 'default.mustache') # self.app.render((data), 'default.mustache')
# Check domain name validation # Check domain name validation
data = dict() data = dict()
host, port = None, None host, port = None, None
try: try:
stype, cache = detSitePar(vars(self.app.pargs)) stype, cache = detSitePar(vars(pargs))
except RuntimeError as e: except RuntimeError as e:
Log.debug(self, str(e)) Log.debug(self, str(e))
Log.error(self, "Please provide valid options to creating site") Log.error(self, "Please provide valid options to creating site")
if stype is None and self.app.pargs.proxy: if stype is None and pargs.proxy:
stype, cache = 'proxy', '' stype, cache = 'proxy', ''
proxyinfo = self.app.pargs.proxy[0].strip() proxyinfo = pargs.proxy[0].strip()
if not proxyinfo: if not proxyinfo:
Log.error(self, "Please provide proxy server host information") Log.error(self, "Please provide proxy server host information")
proxyinfo = proxyinfo.split(':') proxyinfo = proxyinfo.split(':')
host = proxyinfo[0].strip() host = proxyinfo[0].strip()
port = '80' if len(proxyinfo) < 2 else proxyinfo[1].strip() port = '80' if len(proxyinfo) < 2 else proxyinfo[1].strip()
elif stype is None and not self.app.pargs.proxy: elif stype is None and not pargs.proxy:
stype, cache = 'html', 'basic' stype, cache = 'html', 'basic'
elif stype and self.app.pargs.proxy: elif stype and pargs.proxy:
Log.error(self, "proxy should not be used with other site types") Log.error(self, "proxy should not be used with other site types")
if not self.app.pargs.site_name: if not pargs.site_name:
try: try:
while not self.app.pargs.site_name: while not pargs.site_name:
# preprocessing before finalize site name # preprocessing before finalize site name
self.app.pargs.site_name = (input('Enter site name : ') pargs.site_name = (input('Enter site name : ')
.strip()) .strip())
except IOError as e: except IOError as e:
Log.debug(self, str(e)) Log.debug(self, str(e))
Log.error(self, "Unable to input site name, Please try again!") Log.error(self, "Unable to input site name, Please try again!")
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) (wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
wo_domain_type, wo_root_domain = GetDomainlevel(wo_domain)
if not wo_domain.strip(): if not wo_domain.strip():
Log.error("Invalid domain name, " Log.error("Invalid domain name, "
"Provide valid domain name") "Provide valid domain name")
@@ -442,7 +449,7 @@ class WOSiteCreateController(CementBaseController):
data['port'] = port data['port'] = port
data['basic'] = True data['basic'] = True
if self.app.pargs.php73: if pargs.php73:
data = dict(site_name=wo_domain, www_domain=wo_www_domain, data = dict(site_name=wo_domain, www_domain=wo_www_domain,
static=False, basic=False, php73=True, wp=False, static=False, basic=False, php73=True, wp=False,
wpfc=False, wpsc=False, wprocket=False, wpce=False, wpfc=False, wpsc=False, wprocket=False, wpce=False,
@@ -475,9 +482,9 @@ class WOSiteCreateController(CementBaseController):
data['wp'] = True data['wp'] = True
data['basic'] = False data['basic'] = False
data[cache] = True data[cache] = True
data['wp-user'] = self.app.pargs.user data['wp-user'] = pargs.user
data['wp-email'] = self.app.pargs.email data['wp-email'] = pargs.email
data['wp-pass'] = self.app.pargs.wppass data['wp-pass'] = pargs.wppass
if stype in ['wpsubdir', 'wpsubdomain']: if stype in ['wpsubdir', 'wpsubdomain']:
data['multisite'] = True data['multisite'] = True
if stype == 'wpsubdir': if stype == 'wpsubdir':
@@ -485,25 +492,25 @@ class WOSiteCreateController(CementBaseController):
else: else:
pass pass
if data and self.app.pargs.php73: if data and pargs.php73:
data['php73'] = True data['php73'] = True
php73 = 1 php73 = 1
elif data: elif data:
data['php73'] = False data['php73'] = False
php73 = 0 php73 = 0
if ((not self.app.pargs.wpfc) and if ((not pargs.wpfc) and
(not self.app.pargs.wpsc) and (not pargs.wpsc) and
(not self.app.pargs.wprocket) and (not pargs.wprocket) and
(not self.app.pargs.wpce) and (not pargs.wpce) and
(not self.app.pargs.wpredis)): (not pargs.wpredis)):
data['basic'] = True data['basic'] = True
if (cache == 'wpredis'): if (cache == 'wpredis'):
cache = 'wpredis' cache = 'wpredis'
data['wpredis'] = True data['wpredis'] = True
data['basic'] = False data['basic'] = False
self.app.pargs.wpredis = True pargs.wpredis = True
# Check rerequired packages are installed or not # Check rerequired packages are installed or not
wo_auth = site_package_check(self, stype) wo_auth = site_package_check(self, stype)
@@ -619,7 +626,7 @@ class WOSiteCreateController(CementBaseController):
"and please try again") "and please try again")
# Setup WordPress if Wordpress site # Setup WordPress if Wordpress site
if (data['wp'] and (not self.app.pargs.vhostonly)): if (data['wp'] and (not pargs.vhostonly)):
try: try:
wo_wp_creds = setupwordpress(self, data) wo_wp_creds = setupwordpress(self, data)
# Add database information for site into database # Add database information for site into database
@@ -644,7 +651,7 @@ class WOSiteCreateController(CementBaseController):
"`tail /var/log/wo/wordops.log` " "`tail /var/log/wo/wordops.log` "
"and please try again") "and please try again")
if (data['wp'] and (self.app.pargs.vhostonly)): if (data['wp'] and (pargs.vhostonly)):
try: try:
wo_wp_creds = setupwordpress(self, data) wo_wp_creds = setupwordpress(self, data)
# Add database information for site into database # Add database information for site into database
@@ -745,10 +752,10 @@ class WOSiteCreateController(CementBaseController):
for msg in wo_auth: for msg in wo_auth:
Log.info(self, Log.ENDC + msg, log=False) Log.info(self, Log.ENDC + msg, log=False)
if data['wp'] and (not self.app.pargs.vhostonly): if data['wp'] and (not pargs.vhostonly):
Log.info(self, Log.ENDC + "WordPress admin user :" Log.info(self, Log.ENDC + "WordPress admin user :"
" {0}".format(wo_wp_creds['wp_user']), log=False) " {0}".format(wo_wp_creds['wp_user']), log=False)
Log.info(self, Log.ENDC + "WordPress admin user password : {0}" Log.info(self, Log.ENDC + "WordPress admin password : {0}"
.format(wo_wp_creds['wp_pass']), log=False) .format(wo_wp_creds['wp_pass']), log=False)
display_cache_settings(self, data) display_cache_settings(self, data)
@@ -759,32 +766,34 @@ class WOSiteCreateController(CementBaseController):
Log.error(self, "Check the log for details: " Log.error(self, "Check the log for details: "
"`tail /var/log/wo/wordops.log` and please try again") "`tail /var/log/wo/wordops.log` and please try again")
if self.app.pargs.letsencrypt: if pargs.letsencrypt:
data['letsencrypt'] = True data['letsencrypt'] = True
letsencrypt = True letsencrypt = True
if self.app.pargs.dns:
wo_acme_dns = pargs.dns
if data['letsencrypt'] is True: if data['letsencrypt'] is True:
if self.app.pargs.letsencrypt == "subdomain": if pargs.dns:
if self.app.pargs.dns: wo_acme_dns = pargs.dns
setupLetsEncrypt(self, wo_domain, True, False, wo_dns = True
True, wo_acme_dns)
else:
setupLetsEncrypt(self, wo_domain, True)
httpsRedirect(self, wo_domain)
elif self.app.pargs.letsencrypt == "wildcard":
setupLetsEncrypt(self, wo_domain, False, True,
True, wo_acme_dns)
httpsRedirect(self, wo_domain, True, True)
else: else:
if self.app.pargs.dns: wo_acme_dns = ''
setupLetsEncrypt(self, wo_domain, False, wo_dns = False
False, True, wo_acme_dns) if pargs.letsencrypt == "subdomain":
else: wo_subdomain = True
setupLetsEncrypt(self, wo_domain) wo_wildcard = False
httpsRedirect(self, wo_domain) elif pargs.letsencrypt == "wildcard":
wo_wildcard = True
wo_subdomain = False
else:
wo_wildcard = False
wo_subdomain = False
if ((wo_domain_type == 'subdomain') and
(not pargs.letsencrypt == 'wildcard')):
wo_subdomain = True
if self.app.pargs.hsts: setupLetsEncrypt(self, wo_domain, wo_subdomain, wo_wildcard,
wo_dns, wo_acme_dns)
httpsRedirect(self, wo_domain, True, wo_wildcard)
if pargs.hsts:
setupHsts(self, wo_domain) setupHsts(self, wo_domain)
site_url_https(self, wo_domain) site_url_https(self, wo_domain)
@@ -915,6 +924,7 @@ class WOSiteUpdateController(CementBaseController):
self.doupdatesite(pargs) self.doupdatesite(pargs)
def doupdatesite(self, pargs): def doupdatesite(self, pargs):
pargs = self.app.pargs
letsencrypt = False letsencrypt = False
php73 = None php73 = None
@@ -943,14 +953,14 @@ class WOSiteUpdateController(CementBaseController):
try: try:
while not pargs.site_name: while not pargs.site_name:
pargs.site_name = (input('Enter site name : ').strip()) pargs.site_name = (input('Enter site name : ').strip())
except IOError as e: except IOError:
Log.error(self, 'Unable to input site name, Please try again!') Log.error(self, 'Unable to input site name, Please try again!')
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, (wo_domain,
wo_www_domain, ) = ValidateDomain(pargs.site_name) wo_www_domain, ) = ValidateDomain(pargs.site_name)
wo_site_webroot = WOVariables.wo_webroot + wo_domain wo_site_webroot = WOVariables.wo_webroot + wo_domain
wo_domain_type, wo_root_domain = GetDomainlevel(wo_domain)
check_site = getSiteInfo(self, wo_domain) check_site = getSiteInfo(self, wo_domain)
if check_site is None: if check_site is None:
@@ -1231,24 +1241,46 @@ class WOSiteUpdateController(CementBaseController):
return 0 return 0
if pargs.letsencrypt: if pargs.letsencrypt:
if ((wo_domain_type == 'subdomain') and
(not pargs.letsencrypt == 'wildcard') and
(not pargs.letsencrypt == 'off') and
(not pargs.letsencrypt == 'clean') and
(not pargs.letsencrypt == 'purge')):
pargs.letsencrypt == 'subdomain'
if pargs.letsencrypt == 'on': if pargs.letsencrypt == 'on':
data['letsencrypt'] = True data['letsencrypt'] = True
letsencrypt = True letsencrypt = True
if ((wo_domain_type == 'subdomain') and
(not pargs.letsencrypt == 'wildcard')):
wo_subdomain = True
else:
wo_subdomain = False
wo_wildcard = False
elif pargs.letsencrypt == 'subdomain': elif pargs.letsencrypt == 'subdomain':
data['letsencrypt'] = True data['letsencrypt'] = True
letsencrypt = True letsencrypt = True
wo_subdomain = True
wo_wildcard = False
elif pargs.letsencrypt == 'wildcard': elif pargs.letsencrypt == 'wildcard':
data['letsencrypt'] = True data['letsencrypt'] = True
letsencrypt = True letsencrypt = True
wo_wildcard = True
wo_subdomain = False
elif pargs.letsencrypt == 'off': elif pargs.letsencrypt == 'off':
data['letsencrypt'] = False data['letsencrypt'] = False
letsencrypt = False letsencrypt = False
wo_subdomain = False
wo_wildcard = False
elif pargs.letsencrypt == 'clean': elif pargs.letsencrypt == 'clean':
data['letsencrypt'] = False data['letsencrypt'] = False
letsencrypt = False letsencrypt = False
wo_subdomain = False
wo_wildcard = False
elif pargs.letsencrypt == 'purge': elif pargs.letsencrypt == 'purge':
data['letsencrypt'] = False data['letsencrypt'] = False
letsencrypt = False letsencrypt = False
wo_subdomain = False
wo_wildcard = False
if letsencrypt is check_ssl: if letsencrypt is check_ssl:
if letsencrypt is False: if letsencrypt is False:
@@ -1342,36 +1374,32 @@ class WOSiteUpdateController(CementBaseController):
" http://{0}".format(wo_domain)) " http://{0}".format(wo_domain))
return 0 return 0
if self.app.pargs.letsencrypt: if pargs.letsencrypt:
if self.app.pargs.dns:
wo_acme_dns = pargs.dns
if data['letsencrypt'] is True: if data['letsencrypt'] is True:
if not os.path.isfile("{0}/conf/nginx/ssl.conf.disabled" if pargs.dns:
.format(wo_site_webroot)): wo_acme_dns = pargs.dns
if self.app.pargs.letsencrypt == "on": wo_dns = True
if self.app.pargs.dns: else:
setupLetsEncrypt(self, wo_domain, False, wo_acme_dns = ''
False, True, wo_acme_dns) wo_dns = False
else: if not os.path.isfile("{0}/conf/nginx/ssl.conf.disabled"):
setupLetsEncrypt(self, wo_domain) setupLetsEncrypt(self, wo_domain, wo_subdomain,
httpsRedirect(self, wo_domain) wo_wildcard,
elif self.app.pargs.letsencrypt == "subdomain": wo_dns, wo_acme_dns)
if self.app.pargs.dns: httpsRedirect(self, wo_domain, True, wo_wildcard)
setupLetsEncrypt(self, wo_domain, True, False,
True, wo_acme_dns)
else:
setupLetsEncrypt(self, wo_domain, True)
httpsRedirect(self, wo_domain)
elif self.app.pargs.letsencrypt == "wildcard":
setupLetsEncrypt(self, wo_domain, False, True,
True, wo_acme_dns)
httpsRedirect(self, wo_domain, True, True)
site_url_https(self, wo_domain) site_url_https(self, wo_domain)
else: else:
WOFileUtils.mvfile(self, "{0}/conf/nginx/ssl.conf.disabled" WOFileUtils.mvfile(self, "{0}/conf/nginx/ssl.conf.disabled"
.format(wo_site_webroot), .format(wo_site_webroot),
'{0}/conf/nginx/ssl.conf' '{0}/conf/nginx/ssl.conf'
.format(wo_site_webroot)) .format(wo_site_webroot))
WOFileUtils.mvfile(self, "/etc/nginx/conf.d/"
"force-ssl-{0}.conf.disabled"
.format(wo_domain),
'/etc/nginx/conf.d/force-ssl-{0}.conf'
.format(wo_domain))
httpsRedirect(self, wo_domain, True, wo_wildcard)
site_url_https(self, wo_domain) site_url_https(self, wo_domain)
if not WOService.reload_service(self, 'nginx'): if not WOService.reload_service(self, 'nginx'):
@@ -1391,7 +1419,7 @@ class WOSiteUpdateController(CementBaseController):
".PLEASE renew soon . ") ".PLEASE renew soon . ")
elif data['letsencrypt'] is False: elif data['letsencrypt'] is False:
if self.app.pargs.letsencrypt == "off": if pargs.letsencrypt == "off":
if os.path.isfile("{0}/conf/nginx/ssl.conf" if os.path.isfile("{0}/conf/nginx/ssl.conf"
.format(wo_site_webroot)): .format(wo_site_webroot)):
Log.info(self, 'Setting Nginx configuration') Log.info(self, 'Setting Nginx configuration')
@@ -1407,8 +1435,8 @@ class WOSiteUpdateController(CementBaseController):
'{0}/conf/nginx/' '{0}/conf/nginx/'
'hsts.conf.disabled' 'hsts.conf.disabled'
.format(wo_site_webroot)) .format(wo_site_webroot))
elif (self.app.pargs.letsencrypt == "clean" or elif (pargs.letsencrypt == "clean" or
self.app.pargs.letsencrypt == "purge"): pargs.letsencrypt == "purge"):
removeAcmeConf(self, wo_domain) removeAcmeConf(self, wo_domain)
if not WOService.reload_service(self, 'nginx'): if not WOService.reload_service(self, 'nginx'):
Log.error(self, "service nginx reload failed. " Log.error(self, "service nginx reload failed. "
@@ -1798,16 +1826,18 @@ class WOSiteDeleteController(CementBaseController):
@expose(help="Delete website configuration and files") @expose(help="Delete website configuration and files")
@expose(hide=True) @expose(hide=True)
def default(self): def default(self):
if not self.app.pargs.site_name: pargs = self.app.pargs
if not pargs.site_name:
try: try:
while not self.app.pargs.site_name: while not pargs.site_name:
self.app.pargs.site_name = (input('Enter site name : ') pargs.site_name = (input('Enter site name : ')
.strip()) .strip())
except IOError as e: except IOError as e:
Log.error(self, 'could not input site name') Log.error(self, 'could not input site name')
self.app.pargs.site_name = self.app.pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(self.app.pargs.site_name) (wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name)
wo_domain_type, wo_root_domain = GetDomainlevel(wo_domain)
wo_db_name = '' wo_db_name = ''
wo_prompt = '' wo_prompt = ''
wo_nginx_prompt = '' wo_nginx_prompt = ''
@@ -1818,9 +1848,9 @@ class WOSiteDeleteController(CementBaseController):
if not check_domain_exists(self, wo_domain): if not check_domain_exists(self, wo_domain):
Log.error(self, "site {0} does not exist".format(wo_domain)) Log.error(self, "site {0} does not exist".format(wo_domain))
if ((not self.app.pargs.db) and (not self.app.pargs.files) and if ((not pargs.db) and (not pargs.files) and
(not self.app.pargs.all)): (not pargs.all)):
self.app.pargs.all = True pargs.all = True
# Gather information from wo-db for wo_domain # Gather information from wo-db for wo_domain
check_site = getSiteInfo(self, wo_domain) check_site = getSiteInfo(self, wo_domain)
@@ -1834,18 +1864,18 @@ class WOSiteDeleteController(CementBaseController):
wo_mysql_grant_host = self.app.config.get('mysql', 'grant-host') wo_mysql_grant_host = self.app.config.get('mysql', 'grant-host')
if wo_db_name == 'deleted': if wo_db_name == 'deleted':
mark_db_deleted = True mark_db_deleted = True
if self.app.pargs.all: if pargs.all:
self.app.pargs.db = True pargs.db = True
self.app.pargs.files = True pargs.files = True
else: else:
if self.app.pargs.all: if pargs.all:
mark_db_deleted = True mark_db_deleted = True
self.app.pargs.files = True pargs.files = True
# Delete website database # Delete website database
if self.app.pargs.db: if pargs.db:
if wo_db_name != 'deleted' and wo_db_name != '': if wo_db_name != 'deleted' and wo_db_name != '':
if not self.app.pargs.no_prompt: if not pargs.no_prompt:
wo_db_prompt = input('Are you sure, you want to delete' wo_db_prompt = input('Are you sure, you want to delete'
' database [y/N]: ') ' database [y/N]: ')
else: else:
@@ -1870,9 +1900,9 @@ class WOSiteDeleteController(CementBaseController):
) )
# Delete webroot # Delete webroot
if self.app.pargs.files: if pargs.files:
if wo_site_webroot != 'deleted': if wo_site_webroot != 'deleted':
if not self.app.pargs.no_prompt: if not pargs.no_prompt:
wo_web_prompt = input('Are you sure, you want to delete ' wo_web_prompt = input('Are you sure, you want to delete '
'webroot [y/N]: ') 'webroot [y/N]: ')
else: else:
@@ -1891,7 +1921,7 @@ class WOSiteDeleteController(CementBaseController):
mark_webroot_deleted = True mark_webroot_deleted = True
Log.info(self, "Webroot seems to be already deleted") Log.info(self, "Webroot seems to be already deleted")
if not self.app.pargs.force: if not pargs.force:
if (mark_webroot_deleted and mark_db_deleted): if (mark_webroot_deleted and mark_db_deleted):
# TODO Delete nginx conf # TODO Delete nginx conf
removeNginxConf(self, wo_domain) removeNginxConf(self, wo_domain)
@@ -1925,15 +1955,16 @@ class WOSiteListController(CementBaseController):
@expose(help="Lists websites") @expose(help="Lists websites")
def default(self): def default(self):
pargs = self.app.pargs
sites = getAllsites(self) sites = getAllsites(self)
if not sites: if not sites:
pass pass
if self.app.pargs.enabled: if pargs.enabled:
for site in sites: for site in sites:
if site.is_enabled: if site.is_enabled:
Log.info(self, "{0}".format(site.sitename)) Log.info(self, "{0}".format(site.sitename))
elif self.app.pargs.disabled: elif pargs.disabled:
for site in sites: for site in sites:
if not site.is_enabled: if not site.is_enabled:
Log.info(self, "{0}".format(site.sitename)) Log.info(self, "{0}".format(site.sitename))

View File

@@ -978,6 +978,18 @@ def display_cache_settings(self, data):
"page=redis-cache".format(data['site_name'])) "page=redis-cache".format(data['site_name']))
Log.info(self, "Object Cache:\t\tEnable") Log.info(self, "Object Cache:\t\tEnable")
if data['wpfc']:
if data['multisite']:
Log.info(self, "Nginx-Helper configuration :"
"\thttp://{0}/wp-admin/network/settings.php?"
"page=nginx".format(data['site_name']))
else:
Log.info(self, "Nginx-Helper configuration :"
"\thttp://{0}/wp-admin/options-general.php?"
"page=nginx".format(data['site_name']))
def logwatch(self, logfiles): def logwatch(self, logfiles):
import zlib import zlib
@@ -1279,8 +1291,10 @@ def doCleanupAction(self, domain='', webroot='', dbname='', dbuser='',
if os.path.isfile('/etc/nginx/sites-available/{0}' if os.path.isfile('/etc/nginx/sites-available/{0}'
.format(domain)): .format(domain)):
removeNginxConf(self, domain) removeNginxConf(self, domain)
if os.path.isdir('/etc/letsencrypt/renewal/{0}_ecc' if (os.path.isdir('/etc/letsencrypt/renewal/{0}_ecc'
.format(domain)): .format(domain)) or
os.path.isdir('/etc/letsencrypt/live/{0}'
.format(domain))):
removeAcmeConf(self, domain) removeAcmeConf(self, domain)
if webroot: if webroot:

View File

@@ -79,12 +79,19 @@ class WOStackController(CementBaseController):
action='store_true')), action='store_true')),
(['--dashboard'], (['--dashboard'],
dict(help='Install WordOps dashboard', action='store_true')), dict(help='Install WordOps dashboard', action='store_true')),
(['--extplorer'],
dict(help='Install eXtplorer file manager',
action='store_true')),
(['--adminer'], (['--adminer'],
dict(help='Install Adminer stack', action='store_true')), dict(help='Install Adminer stack', action='store_true')),
(['--fail2ban'], (['--fail2ban'],
dict(help='Install Fail2ban stack', action='store_true')), dict(help='Install Fail2ban stack', action='store_true')),
(['--clamav'],
dict(help='Install ClamAV stack', action='store_true')),
(['--utils'], (['--utils'],
dict(help='Install Utils stack', action='store_true')), dict(help='Install Utils stack', action='store_true')),
(['--cheat'],
dict(help='Install cht.sh stack', action='store_true')),
(['--redis'], (['--redis'],
dict(help='Install Redis', action='store_true')), dict(help='Install Redis', action='store_true')),
(['--phpredisadmin'], (['--phpredisadmin'],
@@ -119,11 +126,13 @@ class WOStackController(CementBaseController):
and (not pargs.mysqlclient) and (not pargs.mysqltuner) and and (not pargs.mysqlclient) and (not pargs.mysqltuner) and
(not pargs.adminer) and (not pargs.utils) and (not pargs.adminer) and (not pargs.utils) and
(not pargs.redis) and (not pargs.proftpd) and (not pargs.redis) and (not pargs.proftpd) and
(not pargs.extplorer) and
(not pargs.cheat) and (not pargs.clamav) and
(not pargs.phpredisadmin) and (not pargs.phpredisadmin) and
(not pargs.php73)): (not pargs.php73)):
pargs.web = True pargs.web = True
pargs.admin = True pargs.admin = True
pargs.security = True pargs.fail2ban = True
if pargs.all: if pargs.all:
pargs.web = True pargs.web = True
@@ -131,6 +140,7 @@ class WOStackController(CementBaseController):
pargs.php73 = True pargs.php73 = True
pargs.redis = True pargs.redis = True
pargs.proftpd = True pargs.proftpd = True
pargs.clamav = True
if pargs.web: if pargs.web:
pargs.nginx = True pargs.nginx = True
@@ -139,20 +149,19 @@ class WOStackController(CementBaseController):
pargs.wpcli = True pargs.wpcli = True
if pargs.admin: if pargs.admin:
pargs.nginx = True pargs.web = True
pargs.php = True
pargs.mysql = True
pargs.adminer = True pargs.adminer = True
pargs.phpmyadmin = True pargs.phpmyadmin = True
pargs.composer = True
pargs.utils = True pargs.utils = True
pargs.netdata = True pargs.netdata = True
pargs.dashboard = True pargs.dashboard = True
pargs.phpredisadmin = True pargs.phpredisadmin = True
pargs.mysqltuner = True pargs.extplorer = True
pargs.cheat = True
if pargs.security: if pargs.security:
pargs.fail2ban = True pargs.fail2ban = True
pargs.clamav = True
# Redis # Redis
if pargs.redis: if pargs.redis:
@@ -174,14 +183,14 @@ class WOStackController(CementBaseController):
if WOAptGet.is_installed(self, 'nginx-plus'): if WOAptGet.is_installed(self, 'nginx-plus'):
Log.info(self, "NGINX PLUS Detected ...") Log.info(self, "NGINX PLUS Detected ...")
apt = ["nginx-plus"] + WOVariables.wo_nginx apt = ["nginx-plus"] + WOVariables.wo_nginx
self.post_pref(apt, packages) self.post_pref(apt, empty_packages)
elif WOAptGet.is_installed(self, 'nginx'): elif WOAptGet.is_installed(self, 'nginx'):
Log.info(self, "WordOps detected an already " Log.info(self, "WordOps detected an already "
"installed nginx package." "installed nginx package."
"It may or may not have " "It may or may not have "
"required modules.\n") "required modules.\n")
apt = ["nginx"] + WOVariables.wo_nginx apt = ["nginx"] + WOVariables.wo_nginx
self.post_pref(apt, packages) self.post_pref(apt, empty_packages)
else: else:
Log.debug(self, "Nginx Stable already installed") Log.debug(self, "Nginx Stable already installed")
@@ -213,10 +222,12 @@ class WOStackController(CementBaseController):
# MariaDB 10.3 # MariaDB 10.3
if pargs.mysql: if pargs.mysql:
pargs.mysqltuner = True
Log.debug(self, "Setting apt_packages variable for MySQL") Log.debug(self, "Setting apt_packages variable for MySQL")
if not WOShellExec.cmd_exec(self, "mysqladmin ping"): if not WOShellExec.cmd_exec(self, "mysqladmin ping"):
apt_packages = apt_packages + WOVariables.wo_mysql apt_packages = apt_packages + WOVariables.wo_mysql
# mysqlclient
if pargs.mysqlclient: if pargs.mysqlclient:
Log.debug(self, "Setting apt_packages variable " Log.debug(self, "Setting apt_packages variable "
"for MySQL Client") "for MySQL Client")
@@ -245,6 +256,15 @@ class WOStackController(CementBaseController):
Log.debug(self, "Fail2ban already installed") Log.debug(self, "Fail2ban already installed")
Log.info(self, "Fail2ban already installed") Log.info(self, "Fail2ban already installed")
# ClamAV
if pargs.clamav:
Log.debug(self, "Setting apt_packages variable for ClamAV")
if not WOAptGet.is_installed(self, 'clamav'):
apt_packages = apt_packages + ["clamav"]
else:
Log.debug(self, "ClamAV already installed")
Log.info(self, "ClamAV already installed")
# proftpd # proftpd
if pargs.proftpd: if pargs.proftpd:
Log.debug(self, "Setting apt_packages variable for ProFTPd") Log.debug(self, "Setting apt_packages variable for ProFTPd")
@@ -315,7 +335,7 @@ class WOStackController(CementBaseController):
"htdocs/db/adminer/adminer.css" "htdocs/db/adminer/adminer.css"
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
"Adminer theme"]] "Adminer theme"]]
# mysqltuner
if pargs.mysqltuner: if pargs.mysqltuner:
Log.debug(self, "Setting packages variable for MySQLTuner ") Log.debug(self, "Setting packages variable for MySQLTuner ")
packages = packages + [["https://raw." packages = packages + [["https://raw."
@@ -347,16 +367,25 @@ class WOStackController(CementBaseController):
"releases/download/v{0}/wordops-dashboard.tar.gz" "releases/download/v{0}/wordops-dashboard.tar.gz"
.format(WOVariables.wo_dashboard), .format(WOVariables.wo_dashboard),
"/var/lib/wo/tmp/wo-dashboard.tar.gz", "/var/lib/wo/tmp/wo-dashboard.tar.gz",
"WordOps Dashboard"], "WordOps Dashboard"]]
["https://github.com/soerennb/"
"extplorer/archive/v{0}.tar.gz"
.format(WOVariables.wo_extplorer),
"/var/lib/wo/tmp/extplorer.tar.gz",
"eXtplorer"]]
else: else:
Log.debug(self, "WordOps dashboard already installed") Log.debug(self, "WordOps dashboard already installed")
Log.info(self, "WordOps dashboard already installed") Log.info(self, "WordOps dashboard already installed")
# eXtplorer
if pargs.explorer:
if not os.path.isdir('/var/www/22222/htdocs/files'):
Log.debug(self, "Setting packages variable for eXtplorer")
packages = packages + \
[["https://github.com/soerennb/"
"extplorer/archive/v{0}.tar.gz"
.format(WOVariables.wo_extplorer),
"/var/lib/wo/tmp/extplorer.tar.gz",
"eXtplorer"]]
else:
Log.debug(self, "eXtplorer is already installed")
Log.info(self, "eXtplorer is already installed")
# UTILS # UTILS
if pargs.utils: if pargs.utils:
Log.debug(self, "Setting packages variable for utils") Log.debug(self, "Setting packages variable for utils")
@@ -399,6 +428,17 @@ class WOStackController(CementBaseController):
'/var/lib/wo/tmp/anemometer.tar.gz', '/var/lib/wo/tmp/anemometer.tar.gz',
'Anemometer'] 'Anemometer']
] ]
if pargs.cheat:
if (not os.path.isfile('/usr/local/bin/cht.sh') and
not os.path.isfile('/usr/bin/cht.sh')):
Log.debug(self, "Setting packages variable for cht.sh")
packages = packages + [["https://cht.sh/:cht.sh",
"/usr/local/bin/cht.sh",
"cht.sh"]]
else:
Log.debug(self, "cht.sh is already installed")
Log.info(self, "cht.sh is already installed")
except Exception as e: except Exception as e:
Log.debug(self, "{0}".format(e)) Log.debug(self, "{0}".format(e))
@@ -459,6 +499,8 @@ class WOStackController(CementBaseController):
pargs.proftpd = True pargs.proftpd = True
pargs.utils = True pargs.utils = True
pargs.redis = True pargs.redis = True
packages = \
packages + ['/var/www/22222/htdocs/*']
if pargs.web: if pargs.web:
pargs.nginx = True pargs.nginx = True
@@ -646,6 +688,8 @@ class WOStackController(CementBaseController):
pargs.proftpd = True pargs.proftpd = True
pargs.utils = True pargs.utils = True
pargs.redis = True pargs.redis = True
packages = \
packages + ['/var/www/22222/htdocs/*']
if pargs.web: if pargs.web:
pargs.nginx = True pargs.nginx = True

View File

@@ -4,8 +4,8 @@ import os
import random import random
import shutil import shutil
import string import string
import requests
import psutil import psutil
import requests
from wo.cli.plugins.site_functions import * from wo.cli.plugins.site_functions import *
from wo.cli.plugins.stack_services import WOStackStatusController from wo.cli.plugins.stack_services import WOStackStatusController
@@ -141,7 +141,7 @@ def pre_pref(self, apt_packages):
WORepo.add(self, ppa=WOVariables.wo_redis_repo) WORepo.add(self, ppa=WOVariables.wo_redis_repo)
def post_pref(self, apt_packages, packages): def post_pref(self, apt_packages, packages, upgrade=False):
"""Post activity after installation of packages""" """Post activity after installation of packages"""
if (apt_packages): if (apt_packages):
# Nginx configuration # Nginx configuration
@@ -150,28 +150,29 @@ def post_pref(self, apt_packages, packages):
ngxcnf = '/etc/nginx/conf.d' ngxcnf = '/etc/nginx/conf.d'
ngxcom = '/etc/nginx/common' ngxcom = '/etc/nginx/common'
ngxroot = '/var/www/' ngxroot = '/var/www/'
if (WOVariables.wo_distro == 'ubuntu' or if upgrade:
WOVariables.wo_platform_codename == 'buster'): if os.path.isdir('/etc/nginx'):
data = dict(tls13=True) WOGit.add(self,
else: ["/etc/nginx"],
data = dict(tls13=False) msg="Adding Nginx into Git")
WOTemplate.tmpl_render(self, data = dict(tls13=True)
'/etc/nginx/nginx.conf', WOTemplate.render(self,
'nginx-core.mustache', data) '/etc/nginx/nginx.conf',
'nginx-core.mustache', data)
if not os.path.isfile('{0}/gzip.conf.disabled'.format(ngxcnf)): if not os.path.isfile('{0}/gzip.conf.disabled'.format(ngxcnf)):
data = dict() data = dict()
WOTemplate.tmpl_render(self, '{0}/gzip.conf'.format(ngxcnf), WOTemplate.render(self, '{0}/gzip.conf'.format(ngxcnf),
'gzip.mustache', data) 'gzip.mustache', data)
if not os.path.isfile('{0}/brotli.conf'.format(ngxcnf)): if not os.path.isfile('{0}/brotli.conf'.format(ngxcnf)):
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/brotli.conf.disabled' '{0}/brotli.conf.disabled'
.format(ngxcnf), .format(ngxcnf),
'brotli.mustache', data) 'brotli.mustache', data)
WOTemplate.tmpl_render(self, '{0}/tweaks.conf'.format(ngxcnf), WOTemplate.render(self, '{0}/tweaks.conf'.format(ngxcnf),
'tweaks.mustache', data) 'tweaks.mustache', data)
# Fix for white screen death with NGINX PLUS # Fix for white screen death with NGINX PLUS
if not WOFileUtils.grep(self, '/etc/nginx/fastcgi_params', if not WOFileUtils.grep(self, '/etc/nginx/fastcgi_params',
@@ -181,32 +182,31 @@ def post_pref(self, apt_packages, packages):
wo_nginx.write('fastcgi_param \tSCRIPT_FILENAME ' wo_nginx.write('fastcgi_param \tSCRIPT_FILENAME '
'\t$request_filename;\n') '\t$request_filename;\n')
if os.path.isfile('/etc/nginx/nginx.conf'): data = dict(php="9000", debug="9001",
data = dict(php="9000", debug="9001",
php7="9070", debug7="9170") php7="9070", debug7="9170")
WOTemplate.tmpl_render( WOTemplate.render(
self, '{0}/upstream.conf'.format(ngxcnf), self, '{0}/upstream.conf'.format(ngxcnf),
'upstream.mustache', data, overwrite=True) 'upstream.mustache', data, overwrite=True)
data = dict(phpconf=True if data = dict(phpconf=True if
WOAptGet.is_installed(self, 'php7.2-fpm') WOAptGet.is_installed(self, 'php7.2-fpm')
else False) else False)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/stub_status.conf'.format(ngxcnf), '{0}/stub_status.conf'.format(ngxcnf),
'stub_status.mustache', data) 'stub_status.mustache', data)
data = dict() data = dict()
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/webp.conf'.format(ngxcnf), '{0}/webp.conf'.format(ngxcnf),
'webp.mustache', data) 'webp.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/cloudflare.conf'.format(ngxcnf), '{0}/cloudflare.conf'.format(ngxcnf),
'cloudflare.mustache', data) 'cloudflare.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/map-wp-fastcgi-cache.conf'.format( '{0}/map-wp-fastcgi-cache.conf'.format(
ngxcnf), ngxcnf),
'map-wp.mustache', data) 'map-wp.mustache', data)
# Setup Nginx common directory # Setup Nginx common directory
if not os.path.exists('{0}'.format(ngxcom)): if not os.path.exists('{0}'.format(ngxcom)):
@@ -218,88 +218,88 @@ def post_pref(self, apt_packages, packages):
data = dict() data = dict()
# Common Configuration # Common Configuration
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/locations-wo.conf' '{0}/locations-wo.conf'
.format(ngxcom), .format(ngxcom),
'locations.mustache', data) 'locations.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpsubdir.conf' '{0}/wpsubdir.conf'
.format(ngxcom), .format(ngxcom),
'wpsubdir.mustache', data) 'wpsubdir.mustache', data)
data = dict(upstream="php72") data = dict(upstream="php72")
# PHP 7.2 conf # PHP 7.2 conf
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/php72.conf' '{0}/php72.conf'
.format(ngxcom), .format(ngxcom),
'php.mustache', data) 'php.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/redis-php72.conf' '{0}/redis-php72.conf'
.format(ngxcom), .format(ngxcom),
'redis.mustache', data) 'redis.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpcommon-php72.conf' '{0}/wpcommon-php72.conf'
.format(ngxcom), .format(ngxcom),
'wpcommon.mustache', data) 'wpcommon.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpfc-php72.conf' '{0}/wpfc-php72.conf'
.format(ngxcom), .format(ngxcom),
'wpfc.mustache', data) 'wpfc.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpsc-php72.conf' '{0}/wpsc-php72.conf'
.format(ngxcom), .format(ngxcom),
'wpsc.mustache', data) 'wpsc.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wprocket-php72.conf' '{0}/wprocket-php72.conf'
.format(ngxcom), .format(ngxcom),
'wprocket.mustache', data) 'wprocket.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpce-php72.conf' '{0}/wpce-php72.conf'
.format(ngxcom), .format(ngxcom),
'wpce.mustache', data) 'wpce.mustache', data)
# PHP 7.3 conf # PHP 7.3 conf
if os.path.isdir("/etc/nginx/common"): if os.path.isdir("/etc/nginx/common"):
data = dict(upstream="php73") data = dict(upstream="php73")
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/php73.conf' '{0}/php73.conf'
.format(ngxcom), .format(ngxcom),
'php.mustache', data) 'php.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/redis-php73.conf' '{0}/redis-php73.conf'
.format(ngxcom), .format(ngxcom),
'redis.mustache', data) 'redis.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpcommon-php73.conf' '{0}/wpcommon-php73.conf'
.format(ngxcom), .format(ngxcom),
'wpcommon.mustache', data) 'wpcommon.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpfc-php73.conf' '{0}/wpfc-php73.conf'
.format(ngxcom), .format(ngxcom),
'wpfc.mustache', data) 'wpfc.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpsc-php73.conf' '{0}/wpsc-php73.conf'
.format(ngxcom), .format(ngxcom),
'wpsc.mustache', data) 'wpsc.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wprocket-php73.conf' '{0}/wprocket-php73.conf'
.format(ngxcom), .format(ngxcom),
'wprocket.mustache', data) 'wprocket.mustache', data)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/wpce-php73.conf' '{0}/wpce-php73.conf'
.format(ngxcom), .format(ngxcom),
'wpce.mustache', data) 'wpce.mustache', data)
with open("/etc/nginx/common/release", with open("/etc/nginx/common/release",
"w") as release_file: "w") as release_file:
@@ -310,18 +310,18 @@ def post_pref(self, apt_packages, packages):
# Following files should not be overwrited # Following files should not be overwrited
data = dict(webroot=ngxroot) data = dict(webroot=ngxroot)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/acl.conf' '{0}/acl.conf'
.format(ngxcom), .format(ngxcom),
'acl.mustache', data, overwrite=False) 'acl.mustache', data, overwrite=False)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/blockips.conf' '{0}/blockips.conf'
.format(ngxcnf), .format(ngxcnf),
'blockips.mustache', data, overwrite=False) 'blockips.mustache', data, overwrite=False)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'{0}/fastcgi.conf' '{0}/fastcgi.conf'
.format(ngxcnf), .format(ngxcnf),
'fastcgi.mustache', data, overwrite=False) 'fastcgi.mustache', data, overwrite=False)
# add redis cache format if not already done # add redis cache format if not already done
if (os.path.isfile("/etc/nginx/nginx.conf") and if (os.path.isfile("/etc/nginx/nginx.conf") and
@@ -355,9 +355,9 @@ def post_pref(self, apt_packages, packages):
# 22222 port settings # 22222 port settings
if not os.path.isfile('/etc/nginx/sites-available/22222'): if not os.path.isfile('/etc/nginx/sites-available/22222'):
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'/etc/nginx/sites-available/22222', '/etc/nginx/sites-available/22222',
'22222.mustache', data, overwrite=False) '22222.mustache', data, overwrite=False)
passwd = ''.join([random.choice passwd = ''.join([random.choice
(string.ascii_letters + string.digits) (string.ascii_letters + string.digits)
@@ -455,7 +455,7 @@ def post_pref(self, apt_packages, packages):
Log.debug(self, "{0}".format(e)) Log.debug(self, "{0}".format(e))
Log.error( Log.error(
self, "Failed to generate HTTPS " self, "Failed to generate HTTPS "
"certificate for 22222") "certificate for 22222", False)
if not os.path.isfile('{0}22222/conf/nginx/ssl.conf' if not os.path.isfile('{0}22222/conf/nginx/ssl.conf'
.format(ngxroot)): .format(ngxroot)):
@@ -466,31 +466,39 @@ def post_pref(self, apt_packages, packages):
"/var/www/22222/cert/22222.crt;\n" "/var/www/22222/cert/22222.crt;\n"
"ssl_certificate_key " "ssl_certificate_key "
"/var/www/22222/cert/22222.key;\n") "/var/www/22222/cert/22222.key;\n")
# Nginx Configation into GIT
WOGit.add(self,
["/etc/nginx"], msg="Adding Nginx into Git")
WOService.reload_service(self, 'nginx')
server_ip = requests.get('http://v4.wordops.eu') server_ip = requests.get('http://v4.wordops.eu')
if set(["nginx"]).issubset(set(apt_packages)):
print("WordOps backend configuration was successful\n" WOTemplate.render(self, '/opt/cf-update.sh',
"You can access it on : https://{0}:22222" 'cf-update.mustache',
.format(server_ip)) data, overwrite=False)
print("HTTP Auth User Name: WordOps" + WOFileUtils.chmod(self, "/opt/cf-update.sh", 0o775)
"\nHTTP Auth Password : {0}".format(passwd)) WOCron.setcron_weekly(self, '/opt/cf-update.sh '
WOService.reload_service(self, 'nginx') '> /dev/null 2>&1',
else: comment='Cloudflare IP refresh cronjob '
self.msg = (self.msg + ["HTTP Auth User " 'added by WordOps')
"Name: WordOps"] + self.msg = (self.msg + ["HTTP Auth User "
["HTTP Auth Password : {0}" "Name: WordOps"] +
.format(passwd)]) ["HTTP Auth Password : {0}"
self.msg = (self.msg + ["WordOps backend is available " .format(passwd)])
"on https://{0}:22222 " self.msg = (self.msg + ["WordOps backend is available "
"or https://{1}:22222" "on https://{0}:22222 "
.format(server_ip.text, "or https://{1}:22222"
WOVariables.wo_fqdn)]) .format(server_ip.text,
else: WOVariables.wo_fqdn)])
WOService.restart_service(self, 'nginx')
if upgrade:
try:
WOShellExec.cmd_exec(self, 'nginx -t')
except CommandExecutionError as e:
Log.debug(self, "{0}".format(e))
Log.info(self, "Rolling-Back Nginx"
"configuration")
WOGit.rollback(self, ["/etc/nginx"])
# Nginx Configation into GIT
WOGit.add(self,
["/etc/nginx"], msg="Adding Nginx into Git")
WOService.restart_service(self, 'nginx')
if set(WOVariables.wo_php).issubset(set(apt_packages)): if set(WOVariables.wo_php).issubset(set(apt_packages)):
ngxroot = '/var/www/' ngxroot = '/var/www/'
@@ -657,8 +665,8 @@ def post_pref(self, apt_packages, packages):
WOFileUtils.chown(self, "{0}22222/htdocs" WOFileUtils.chown(self, "{0}22222/htdocs"
.format(ngxroot), .format(ngxroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, recursive=True) 'www-data', recursive=True)
WOGit.add(self, ["/etc/php"], msg="Adding PHP into Git") WOGit.add(self, ["/etc/php"], msg="Adding PHP into Git")
WOService.restart_service(self, 'php7.2-fpm') WOService.restart_service(self, 'php7.2-fpm')
@@ -829,8 +837,8 @@ def post_pref(self, apt_packages, packages):
WOFileUtils.chown(self, "{0}22222/htdocs" WOFileUtils.chown(self, "{0}22222/htdocs"
.format(ngxroot), .format(ngxroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, recursive=True) 'www-data', recursive=True)
WOGit.add(self, ["/etc/php"], msg="Adding PHP into Git") WOGit.add(self, ["/etc/php"], msg="Adding PHP into Git")
WOService.restart_service(self, 'php7.3-fpm') WOService.restart_service(self, 'php7.3-fpm')
@@ -845,17 +853,34 @@ def post_pref(self, apt_packages, packages):
encoding='utf-8', mode='w') encoding='utf-8', mode='w')
config_file.write(config) config_file.write(config)
config_file.close() config_file.close()
else: elif (not WOFileUtils.grep(self, "/etc/mysql/my.cnf", "WordOps")):
with open("/etc/mysql/my.cnf",
"a") as mysql_file:
mysql_file.write("\n# WordOps v3.9.8\n")
wo_ram = psutil.virtual_memory().total / (1024 * 1024) wo_ram = psutil.virtual_memory().total / (1024 * 1024)
# set InnoDB variable depending on the RAM available
wo_ram_innodb = int(wo_ram*0.3) wo_ram_innodb = int(wo_ram*0.3)
wo_ram_log_buffer = int(wo_ram_innodb*0.25) wo_ram_log_buffer = int(wo_ram_innodb*0.25)
wo_ram_log_size = int(wo_ram_log_buffer*0.5) wo_ram_log_size = int(wo_ram_log_buffer*0.5)
# replacing default values # replacing default values
Log.debug(self, "Tuning MySQL configuration") Log.debug(self, "Tuning MySQL configuration")
# set innodb_buffer_pool_instances depending
# on the amount of RAM
if (wo_ram_innodb > 1000) and (wo_ram_innodb < 64000):
wo_innodb_instance = int(
wo_ram_innodb/1000)
elif (wo_ram_innodb < 1000):
wo_innodb_instance = int(1)
elif (wo_ram_innodb > 64000):
wo_innodb_instance = int(64)
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf", WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"innodb_buffer_pool_size = 256M", "innodb_buffer_pool_size = 256M",
"innodb_buffer_pool_size = {0}M" "innodb_buffer_pool_size "
.format(wo_ram_innodb)) "= {0}M\n"
"innodb_buffer_pool_instances "
"= {1}\n"
.format(wo_ram_innodb,
wo_innodb_instance))
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf", WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"innodb_log_buffer_size = 8M", "innodb_log_buffer_size = 8M",
"innodb_log_buffer_size = {0}M" "innodb_log_buffer_size = {0}M"
@@ -870,11 +895,6 @@ def post_pref(self, apt_packages, packages):
"= 600", "= 600",
"wait_timeout " "wait_timeout "
"= 120") "= 120")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"skip-external-locking",
"skip-external-locking\n"
"skip-name-resolve = 1\n")
# disabling mariadb binlog # disabling mariadb binlog
WOFileUtils.searchreplace(self, WOFileUtils.searchreplace(self,
"/etc/mysql/my.cnf", "/etc/mysql/my.cnf",
@@ -924,15 +944,8 @@ def post_pref(self, apt_packages, packages):
"table_open_cache = 16000") "table_open_cache = 16000")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf", WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"max_allowed_packet = 16M", "max_allowed_packet = 16M",
"max_allowed_packet = 64M") "max_allowed_packet = 64M\n"
if (wo_ram_innodb > 1000) and (wo_ram_innodb < 64000): "skip-name-resolve=1\n")
wo_innodb_instance = int(wo_ram_innodb/1000)
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"# * Security Features",
"innodb_buffer_pool_instances "
"= {0}\n"
.format(wo_innodb_instance) +
"# * Security Features")
WOService.stop_service(self, 'mysql') WOService.stop_service(self, 'mysql')
WOFileUtils.mvfile(self, '/var/lib/mysql/ib_logfile0', WOFileUtils.mvfile(self, '/var/lib/mysql/ib_logfile0',
@@ -951,20 +964,20 @@ def post_pref(self, apt_packages, packages):
if set(WOVariables.wo_fail2ban).issubset(set(apt_packages)): if set(WOVariables.wo_fail2ban).issubset(set(apt_packages)):
if not os.path.isfile("/etc/fail2ban/jail.d/custom.conf"): if not os.path.isfile("/etc/fail2ban/jail.d/custom.conf"):
data = dict() data = dict()
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'/etc/fail2ban/jail.d/custom.conf', '/etc/fail2ban/jail.d/custom.conf',
'fail2ban.mustache', 'fail2ban.mustache',
data, overwrite=False) data, overwrite=False)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'/etc/fail2ban/filter.d/' '/etc/fail2ban/filter.d/'
'wo-wordpress.conf', 'wo-wordpress.conf',
'fail2ban-wp.mustache', 'fail2ban-wp.mustache',
data, overwrite=False) data, overwrite=False)
WOTemplate.tmpl_render(self, WOTemplate.render(self,
'/etc/fail2ban/filter.d/' '/etc/fail2ban/filter.d/'
'nginx-forbidden.conf', 'nginx-forbidden.conf',
'fail2ban-forbidden.mustache', 'fail2ban-forbidden.mustache',
data, overwrite=False) data, overwrite=False)
WOGit.add(self, ["/etc/fail2ban"], WOGit.add(self, ["/etc/fail2ban"],
msg="Adding Fail2ban into Git") msg="Adding Fail2ban into Git")
@@ -1083,7 +1096,11 @@ def post_pref(self, apt_packages, packages):
# enable systemd service # enable systemd service
Log.debug(self, "Enabling redis systemd service") Log.debug(self, "Enabling redis systemd service")
WOShellExec.cmd_exec(self, "systemctl enable redis-server") WOShellExec.cmd_exec(self, "systemctl enable redis-server")
if os.path.isfile("/etc/redis/redis.conf"): if (os.path.isfile("/etc/redis/redis.conf") and
not WOFileUtils.grep(self, "/etc/mysql/my.cnf", "WordOps")):
with open("/etc/redis/redis.conf",
"a") as redis_file:
redis_file.write("\n# WordOps v3.9.8\n")
wo_ram = psutil.virtual_memory().total / (1024 * 1024) wo_ram = psutil.virtual_memory().total / (1024 * 1024)
if wo_ram < 1024: if wo_ram < 1024:
Log.debug(self, "Setting maxmemory variable to " Log.debug(self, "Setting maxmemory variable to "
@@ -1127,6 +1144,18 @@ def post_pref(self, apt_packages, packages):
'redis', 'redis', recursive=False) 'redis', 'redis', recursive=False)
WOService.restart_service(self, 'redis-server') WOService.restart_service(self, 'redis-server')
# Redis configuration
if set(["clamav"]).issubset(set(apt_packages)):
Log.debug("Setting up freshclam cronjob")
WOTemplate.render(self, '/opt/freshclam.sh',
'freshclam.mustache',
data, overwrite=False)
WOFileUtils.chmod(self, "/opt/freshclam.sh", 0o775)
WOCron.setcron_weekly(self, '/opt/freshclam.sh '
'> /dev/null 2>&1',
comment='ClamAV freshclam cronjob '
'added by WordOps')
if (packages): if (packages):
if any('/usr/local/bin/wp' == x[1] for x in packages): if any('/usr/local/bin/wp' == x[1] for x in packages):
Log.debug(self, "Setting Privileges" Log.debug(self, "Setting Privileges"
@@ -1182,15 +1211,16 @@ def post_pref(self, apt_packages, packages):
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
"$cfg[\'Servers\'][$i][\'host\']" "$cfg[\'Servers\'][$i][\'host\']"
" = \'localhost\';", "$cfg" " = \'localhost\';", "$cfg"
"[\'Servers\'][$i][\'host\'] = \'{0}\';" "[\'Servers\'][$i][\'host\'] "
"= \'{0}\';"
.format(WOVariables.wo_mysql_host)) .format(WOVariables.wo_mysql_host))
Log.debug(self, 'Setting Privileges of webroot permission to ' Log.debug(self, 'Setting Privileges of webroot permission to '
'{0}22222/htdocs/db/pma file ' '{0}22222/htdocs/db/pma file '
.format(WOVariables.wo_webroot)) .format(WOVariables.wo_webroot))
WOFileUtils.chown(self, '{0}22222/htdocs' WOFileUtils.chown(self, '{0}22222/htdocs'
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, 'www-data',
recursive=True) recursive=True)
# composer install and phpmyadmin update # composer install and phpmyadmin update
@@ -1210,8 +1240,8 @@ def post_pref(self, apt_packages, packages):
"/var/www/22222/htdocs/db/pma/") "/var/www/22222/htdocs/db/pma/")
WOFileUtils.chown(self, '{0}22222/htdocs/db/pma' WOFileUtils.chown(self, '{0}22222/htdocs/db/pma'
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, 'www-data',
recursive=True) recursive=True)
if any('/usr/bin/mysqltuner' == x[1] if any('/usr/bin/mysqltuner' == x[1]
@@ -1290,8 +1320,8 @@ def post_pref(self, apt_packages, packages):
.format(WOVariables.wo_webroot)) .format(WOVariables.wo_webroot))
WOFileUtils.chown(self, '{0}22222/htdocs' WOFileUtils.chown(self, '{0}22222/htdocs'
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, 'www-data',
recursive=True) recursive=True)
# Extplorer FileManager # Extplorer FileManager
@@ -1313,8 +1343,8 @@ def post_pref(self, apt_packages, packages):
.format(WOVariables.wo_webroot)) .format(WOVariables.wo_webroot))
WOFileUtils.chown(self, '{0}22222/htdocs' WOFileUtils.chown(self, '{0}22222/htdocs'
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, 'www-data',
recursive=True) recursive=True)
# webgrind # webgrind
@@ -1358,8 +1388,8 @@ def post_pref(self, apt_packages, packages):
.format(WOVariables.wo_webroot)) .format(WOVariables.wo_webroot))
WOFileUtils.chown(self, '{0}22222/htdocs' WOFileUtils.chown(self, '{0}22222/htdocs'
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, 'www-data',
recursive=True) recursive=True)
# anemometer # anemometer
if any('/var/lib/wo/tmp/anemometer.tar.gz' == x[1] if any('/var/lib/wo/tmp/anemometer.tar.gz' == x[1]
@@ -1418,10 +1448,20 @@ def post_pref(self, apt_packages, packages):
out=wo_anemometer) out=wo_anemometer)
wo_anemometer.close() wo_anemometer.close()
# pt-query-advisor
if any('/usr/bin/pt-query-advisor' == x[1] if any('/usr/bin/pt-query-advisor' == x[1]
for x in packages): for x in packages):
WOFileUtils.chmod(self, "/usr/bin/pt-query-advisor", 0o775) WOFileUtils.chmod(self, "/usr/bin/pt-query-advisor", 0o775)
# cht.sh
if any('/usr/local/bin/cht.sh' == x[1]
for x in packages):
WOFileUtils.chmod(self, "/usr/local/bin/cht.sh", 0o775)
if not WOFileUtils.grep(self, "~/.bashrc", "cheat"):
with open("~/.bashrc",
"a") as wo_bashrc:
wo_bashrc.write("\nalias cheat='cht.sh'\n")
# phpredisadmin # phpredisadmin
if any('/var/lib/wo/tmp/pra.tar.gz' == x[1] if any('/var/lib/wo/tmp/pra.tar.gz' == x[1]
for x in packages): for x in packages):
@@ -1435,21 +1475,21 @@ def post_pref(self, apt_packages, packages):
.format(WOVariables.wo_webroot)) .format(WOVariables.wo_webroot))
WOFileUtils.chown(self, '{0}22222/htdocs' WOFileUtils.chown(self, '{0}22222/htdocs'
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, 'www-data',
recursive=True) recursive=True)
if os.path.isfile("/usr/local/bin/composer"): if os.path.isfile("/usr/local/bin/composer"):
WOShellExec.cmd_exec(self, "sudo -u www-data -H " WOShellExec.cmd_exec(self, "/usr/local/bin/composer"
"composer " "create-project --no-plugins "
"create-project -n -s dev " "--no-scripts -n -s dev "
"erik-dubbelboer/php-redis-admin " "erik-dubbelboer/php-redis-admin "
"/var/www/22222/htdocs/cache" "/var/www/22222/htdocs/cache"
"/redis/phpRedisAdmin ") "/redis/phpRedisAdmin ")
Log.debug(self, 'Setting Privileges of webroot permission to ' Log.debug(self, 'Setting Privileges of webroot permission to '
'{0}22222/htdocs/cache/file ' '{0}22222/htdocs/cache/redis'
.format(WOVariables.wo_webroot)) .format(WOVariables.wo_webroot))
WOFileUtils.chown(self, '{0}22222/htdocs' WOFileUtils.chown(self, '{0}22222/htdocs'
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
WOVariables.wo_php_user, 'www-data',
WOVariables.wo_php_user, 'www-data',
recursive=True) recursive=True)

View File

@@ -19,7 +19,7 @@ class WOStackStatusController(CementBaseController):
def start(self): def start(self):
"""Start services""" """Start services"""
services = [] services = []
pargs = pargs = self.app.pargs pargs = self.app.pargs
if not (pargs.nginx or pargs.php or if not (pargs.nginx or pargs.php or
pargs.php73 or pargs.php73 or
pargs.mysql or pargs.mysql or

View File

@@ -64,7 +64,7 @@ class WOStackUpgradeController(CementBaseController):
packages = [] packages = []
nginx_packages = [] nginx_packages = []
empty_packages = [] empty_packages = []
pargs = pargs = self.app.pargs pargs = self.app.pargs
if ((not pargs.web) and (not pargs.nginx) and if ((not pargs.web) and (not pargs.nginx) and
(not pargs.php) and (not pargs.php73) and (not pargs.php) and (not pargs.php73) and
@@ -184,7 +184,7 @@ class WOStackUpgradeController(CementBaseController):
Log.error(self, "Not starting package update") Log.error(self, "Not starting package update")
Log.info(self, "Updating APT packages, please wait...") Log.info(self, "Updating APT packages, please wait...")
if set(WOVariables.wo_nginx).issubset(set(apt_packages)): if set(WOVariables.wo_nginx).issubset(set(apt_packages)):
pre_pref(self, nginx_packages) pre_pref(self, ["nginx-custom", "nginx-wo"])
# apt-get update # apt-get update
WOAptGet.update(self) WOAptGet.update(self)
if set(WOVariables.wo_php).issubset(set(apt_packages)): if set(WOVariables.wo_php).issubset(set(apt_packages)):
@@ -195,7 +195,7 @@ class WOStackUpgradeController(CementBaseController):
auto=False, purge=True) auto=False, purge=True)
# Update packages # Update packages
WOAptGet.install(self, apt_packages) WOAptGet.install(self, apt_packages)
post_pref(self, apt_packages, empty_packages) post_pref(self, apt_packages, empty_packages, True)
# Post Actions after package updates # Post Actions after package updates
if len(packages): if len(packages):

View File

@@ -0,0 +1,23 @@
#!/usr/bin/env bash
# WordOps bash script to update cloudflare IP
CURL_BIN=$(command -v curl)
CF_IPV4=$($CURL_BIN -sL https://www.cloudflare.com/ips-v4)
CF_IPV6=$($CURL_BIN -sL https://www.cloudflare.com/ips-v6)
echo -e '# WordOps (wo) set visitors real ip with Cloudflare\n' > /etc/nginx/conf.d/cloudflare.conf
echo "####################################"
echo "Adding Cloudflare IPv4"
echo "####################################"
for cf_ip4 in $CF_IPV4; do
echo "set_real_ip_from $cf_ip4;" >> /etc/nginx/conf.d/cloudflare.conf
done
echo "####################################"
echo "Adding Cloudflare IPv6"
echo "####################################"
for cf_ip6 in $CF_IPV6; do
echo "set_real_ip_from $cf_ip6;" >> /etc/nginx/conf.d/cloudflare.conf
done
echo 'real_ip_header CF-Connecting-IP;' >> /etc/nginx/conf.d/cloudflare.conf
nginx -t && service nginx reload

View File

@@ -0,0 +1,11 @@
#!/usr/bin/env bash
# WordOps ClamAV freshclam script
# script path after installation /opt/freshcham.sh
if [ -x /etc/init.d/clamav-freshclam ]; then
{
/etc/init.d/clamav-freshclam stop
freshclam
/etc/init.d/clamav-freshclam start
} >> /var/log/wo/clamav.log 2>&1
fi

View File

@@ -1,4 +1,4 @@
# NGINX CONFIGURATION FOR FASTCGI_CACHE EXCEPTION - WO v3.9.7 # NGINX CONFIGURATION FOR FASTCGI_CACHE EXCEPTION - WO v3.9.8
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE # DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
# do not cache xhtml request # do not cache xhtml request
@@ -53,7 +53,7 @@ map $request_uri $uri_no_cache {
"~*/commande/" 1; "~*/commande/" 1;
"~*/resetpass/" 1; "~*/resetpass/" 1;
} }
# mobile_prefix needed for WP-Rocket
map $http_user_agent $mobile_prefix { map $http_user_agent $mobile_prefix {
default ""; default "";
"~*iphone" -mobile; "~*iphone" -mobile;
@@ -78,7 +78,14 @@ map $skip_cache $cache_uri {
default 'null cache'; default 'null cache';
} }
# http_prefix needed for WP-Rocket
map $https $https_prefix { map $https $https_prefix {
default ""; default "";
on "-https"; on "-https";
} }
# needed to proxy web-socket connections
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

View File

@@ -47,7 +47,7 @@ class WORepo():
Log.debug(self, "{0}".format(e)) Log.debug(self, "{0}".format(e))
Log.error(self, "Unable to add repo") Log.error(self, "Unable to add repo")
if ppa is not None: if ppa is not None:
WOShellExec.cmd_exec(self, "add-apt-repository -y '{ppa_name}'" WOShellExec.cmd_exec(self, "add-apt-repository -yu '{ppa_name}'"
.format(ppa_name=ppa)) .format(ppa_name=ppa))
def remove(self, ppa=None, repo_url=None): def remove(self, ppa=None, repo_url=None):
@@ -82,10 +82,7 @@ class WORepo():
default keyserver is hkp://keyserver.ubuntu.com default keyserver is hkp://keyserver.ubuntu.com
user can provide other keyserver with keyserver="hkp://xyz" user can provide other keyserver with keyserver="hkp://xyz"
""" """
WOShellExec.cmd_exec(self, "gpg --keyserver {serv}" WOShellExec.cmd_exec(self, "apt-key adv --keyserver {serv}"
.format(serv=(keyserver or .format(serv=(keyserver or
"hkp://keyserver.ubuntu.com")) + "hkp://keyserver.ubuntu.com")) +
" --recv-keys {key}".format(key=keyids)) " --recv-keys {key}".format(key=keyids))
WOShellExec.cmd_exec(self, "gpg -a --export --armor {0}"
.format(keyids) +
" | apt-key add - ")

View File

@@ -21,6 +21,20 @@ class WOCron():
"\\\"; } | crontab -\"") "\\\"; } | crontab -\"")
Log.debug(self, "Cron set") Log.debug(self, "Cron set")
def setcron_daily(self, cmd, comment='Cron set by WordOps', user='root',
min=0, hour=12):
if not WOShellExec.cmd_exec(self, "crontab -l "
"| grep -q \'{0}\'".format(cmd)):
WOShellExec.cmd_exec(self, "/bin/bash -c \"crontab -l "
"2> /dev/null | {{ cat; echo -e"
" \\\""
"\\n@daily"
"{0}".format(cmd) +
" # {0}".format(comment) +
"\\\"; } | crontab -\"")
Log.debug(self, "Cron set")
def remove_cron(self, cmd): def remove_cron(self, cmd):
if WOShellExec.cmd_exec(self, "crontab -l " if WOShellExec.cmd_exec(self, "crontab -l "
"| grep -q \'{0}\'".format(cmd)): "| grep -q \'{0}\'".format(cmd)):

View File

@@ -1,5 +1,6 @@
"""WordOps domain validation module.""" """WordOps domain validation module."""
from urllib.parse import urlparse from urllib.parse import urlparse
import os
def ValidateDomain(url): def ValidateDomain(url):
@@ -22,3 +23,31 @@ def ValidateDomain(url):
final_domain = domain_name final_domain = domain_name
return (final_domain, domain_name) return (final_domain, domain_name)
def GetDomainlevel(domain):
"""
This function returns the domain type : domain, subdomain,
"""
domain_name = domain.split('.')
if domain_name[0] == 'www':
domain_name = domain_name[1:]
if os.path.isfile("/var/lib/wo/public_suffix_list.dat"):
# Read mode opens a file for reading only.
Suffix_file = open(
"/var/lib/wo/public_suffix_list.dat", "r")
# Read all the lines into a list.
for domain_suffix in Suffix_file:
if (str(domain_suffix).strip()) == ('.'.join(domain_name[1:])):
domain_type = 'domain'
root_domain = domain_name[0:]
break
elif (str(domain_suffix).strip()) == ('.'.join(domain_name[2:])):
domain_type = 'subdomain'
root_domain = domain_name[1:]
break
else:
domain_type = 'other'
Suffix_file.close()
return (domain_type, root_domain)

View File

@@ -55,3 +55,27 @@ class WOGit:
return True return True
else: else:
return False return False
def rollback(self, paths, msg="Rolling-Back"):
"""
Rollback last commit to restore previous.
configuration and commit changes automatically
"""
for path in paths:
global git
git = git.bake("--git-dir={0}/.git".format(path),
"--work-tree={0}".format(path))
if os.path.isdir(path):
if not os.path.isdir(path+"/.git"):
Log.error(self, "Unable to find a git repository at {0}"
.format(path))
try:
Log.debug(self, "WOGit: git reset HEAD~ at {0}"
.format(path))
git.reset("--hard HEAD~")
except ErrorReturnCode as e:
Log.debug(self, "{0}".format(e))
Log.error(self, "Unable to git reset at {0} "
.format(path))
else:
Log.debug(self, "WOGit: Path {0} not present".format(path))

View File

@@ -24,7 +24,6 @@ class Log:
if exit: if exit:
self.app.close(1) self.app.close(1)
def info(self, msg, end='\n', log=True): def info(self, msg, end='\n', log=True):
""" """
Logs info messages into log file Logs info messages into log file

View File

@@ -1,10 +1,8 @@
"""WordOps Service Manager""" """WordOps Service Manager"""
import subprocess import subprocess
from subprocess import Popen
from wo.core.logging import Log from wo.core.logging import Log
class WOService(): class WOService():
"""Intialization for service""" """Intialization for service"""
def ___init__(): def ___init__():
@@ -16,21 +14,35 @@ class WOService():
Similar to `service xyz start` Similar to `service xyz start`
""" """
try: try:
if service_name in ['nginx', 'php5-fpm']: if service_name in ['nginx']:
service_cmd = ('{0} -t && service {0} start' # Check Nginx configuration before executing command
.format(service_name)) sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
output, error_output = sub.communicate()
if 'emerg' not in str(error_output):
service_cmd = ('service {0} start'.format(service_name))
retcode = subprocess.getstatusoutput(service_cmd)
if retcode[0] == 0:
Log.info(self, "Starting Nginx " +
"[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
return True
else:
Log.info(
self, "Starting Nginx " + "[" + Log.FAIL +
"Failed" + Log.OKBLUE+"]")
return False
else: else:
service_cmd = ('service {0} start'.format(service_name)) service_cmd = ('service {0} start'.format(service_name))
Log.info(self, "Start : {0:10}" .format(service_name), end='') Log.info(self, "Start : {0:10}" .format(service_name), end='')
retcode = subprocess.getstatusoutput(service_cmd) retcode = subprocess.getstatusoutput(service_cmd)
if retcode[0] == 0: if retcode[0] == 0:
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]") Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
return True return True
else: else:
Log.debug(self, "{0}".format(retcode[1])) Log.debug(self, "{0}".format(retcode[1]))
Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]") Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]")
return False return False
except OSError as e: except OSError as e:
Log.debug(self, "{0}".format(e)) Log.debug(self, "{0}".format(e))
Log.error(self, "\nFailed to start service {0}" Log.error(self, "\nFailed to start service {0}"
@@ -63,21 +75,34 @@ class WOService():
Similar to `service xyz restart` Similar to `service xyz restart`
""" """
try: try:
if service_name in ['nginx', 'php5-fpm']: if service_name in ['nginx']:
service_cmd = ('{0} -t && service {0} restart' # Check Nginx configuration before executing command
.format(service_name)) sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
output, error_output = sub.communicate()
if 'emerg' not in str(error_output):
service_cmd = ('service {0} restart'.format(service_name))
retcode = subprocess.getstatusoutput(service_cmd)
if retcode[0] == 0:
Log.info(self, "Restarting Nginx " +
"[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
return True
else:
Log.info(self, "Restarting Nginx " + "[" + Log.FAIL +
"Failed" + Log.OKBLUE+"]")
return False
else: else:
service_cmd = ('service {0} restart'.format(service_name)) service_cmd = ('service {0} restart'.format(service_name))
Log.info(self, "Restart : {0:10}".format(
Log.info(self, "Restart : {0:10}".format(service_name), end='') service_name), end='')
retcode = subprocess.getstatusoutput(service_cmd) retcode = subprocess.getstatusoutput(service_cmd)
if retcode[0] == 0: if retcode[0] == 0:
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]") Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
return True return True
else: else:
Log.debug(self, "{0}".format(retcode[1])) Log.debug(self, "{0}".format(retcode[1]))
Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]") Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]")
return False return False
except OSError as e: except OSError as e:
Log.debug(self, "{0} {1}".format(e.errno, e.strerror)) Log.debug(self, "{0} {1}".format(e.errno, e.strerror))
Log.error(self, "\nFailed to restart service : {0}" Log.error(self, "\nFailed to restart service : {0}"
@@ -85,25 +110,38 @@ class WOService():
def reload_service(self, service_name): def reload_service(self, service_name):
""" """
Stop service Reload service
Similar to `service xyz stop` Similar to `service xyz reload`
""" """
try: try:
if service_name in ['nginx', 'php5-fpm']: if service_name in ['nginx']:
service_cmd = ('{0} -t && service {0} reload' # Check Nginx configuration before executing command
.format(service_name)) sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
output, error_output = sub.communicate()
if 'emerg' not in str(error_output):
service_cmd = ('service {0} reload'.format(service_name))
retcode = subprocess.getstatusoutput(service_cmd)
if retcode[0] == 0:
Log.info(self, "Reloading Nginx " +
"[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
return True
else:
Log.info(
self, "Reloading Nginx " + "[" + Log.FAIL +
"Failed" + Log.OKBLUE+"]")
return False
else: else:
service_cmd = ('service {0} reload'.format(service_name)) service_cmd = ('service {0} reload'.format(service_name))
Log.info(self, "Reload : {0:10}".format(service_name), end='')
Log.info(self, "Reload : {0:10}".format(service_name), end='') retcode = subprocess.getstatusoutput(service_cmd)
retcode = subprocess.getstatusoutput(service_cmd) if retcode[0] == 0:
if retcode[0] == 0: Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]") return True
return True else:
else: Log.debug(self, "{0}".format(retcode[1]))
Log.debug(self, "{0}".format(retcode[1])) Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]")
Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]") return False
return False
except OSError as e: except OSError as e:
Log.debug(self, "{0}".format(e)) Log.debug(self, "{0}".format(e))
Log.error(self, "\nFailed to reload service {0}" Log.error(self, "\nFailed to reload service {0}"

View File

@@ -7,10 +7,20 @@ Render Templates
class WOTemplate(): class WOTemplate():
def tmpl_render(self, fileconf, template, data, overwrite=True): def render(self, fileconf, template, data, overwrite=True):
data = dict(data) data = dict(data)
if (not overwrite): if (not os.path.isfile('{0}.custom'
if not os.path.isfile('{0}'.format(fileconf)): .format(fileconf))):
if (not overwrite):
if not os.path.isfile('{0}'.format(fileconf)):
Log.debug(self, 'Writting the configuration to '
'file {0}'.format(fileconf))
wo_template = open('{0}'.format(fileconf),
encoding='utf-8', mode='w')
self.app.render((data), '{0}'.format(template),
out=wo_template)
wo_template.close()
else:
Log.debug(self, 'Writting the configuration to ' Log.debug(self, 'Writting the configuration to '
'file {0}'.format(fileconf)) 'file {0}'.format(fileconf))
wo_template = open('{0}'.format(fileconf), wo_template = open('{0}'.format(fileconf),
@@ -19,20 +29,10 @@ class WOTemplate():
out=wo_template) out=wo_template)
wo_template.close() wo_template.close()
else: else:
if (not os.path.isfile('{0}.custom' Log.debug(self, 'Writting the configuration to '
.format(fileconf))): 'file {0}.orig'.format(fileconf))
Log.debug(self, 'Writting the configuration to ' wo_template = open('{0}.orig'.format(fileconf),
'file {0}'.format(fileconf)) encoding='utf-8', mode='w')
wo_template = open('{0}'.format(fileconf), self.app.render((data), '{0}'.format(template),
encoding='utf-8', mode='w') out=wo_template)
self.app.render((data), '{0}'.format(template), wo_template.close()
out=wo_template)
wo_template.close()
else:
Log.debug(self, 'Writting the configuration to '
'file {0}.orig'.format(fileconf))
wo_template = open('{0}.orig'.format(fileconf),
encoding='utf-8', mode='w')
self.app.render((data), '{0}'.format(template),
out=wo_template)
wo_template.close()

View File

@@ -10,7 +10,7 @@ class WOVariables():
"""Intialization of core variables""" """Intialization of core variables"""
# WordOps version # WordOps version
wo_version = "3.9.8.3" wo_version = "3.9.8.4"
# WordOps packages versions # WordOps packages versions
wo_wp_cli = "2.2.0" wo_wp_cli = "2.2.0"
wo_adminer = "4.7.2" wo_adminer = "4.7.2"
@@ -88,22 +88,24 @@ class WOVariables():
# Nginx repo and packages # Nginx repo and packages
if wo_distro == 'ubuntu': if wo_distro == 'ubuntu':
wo_nginx_repo = "ppa:wordops/nginx-wo" wo_nginx_repo = "ppa:wordops/nginx-wo"
elif wo_distro == 'debian':
if wo_platform_codename == 'jessie':
wo_nginx_repo = ("deb http://download.opensuse.org"
"/repositories/home:"
"/virtubox:/WordOps/Debian_8.0/ /")
elif wo_platform_codename == 'stretch':
wo_nginx_repo = ("deb http://download.opensuse.org"
"/repositories/home:"
"/virtubox:/WordOps/Debian_9.0/ /")
elif wo_platform_codename == 'buster':
wo_nginx_repo = ("deb http://download.opensuse.org"
"/repositories/home:"
"/virtubox:/WordOps/Debian_10/ /")
else: else:
wo_nginx_repo = ("deb http://download.opensuse.org/repositories/home:" if wo_distro == 'debian':
"/virtubox:/WordOps/Raspbian_9.0/ /") if wo_platform_codename == 'jessie':
wo_deb_repo = "Debian_8.0"
elif wo_platform_codename == 'stretch':
wo_deb_repo = "Debian_9.0"
elif wo_platform_codename == 'buster':
wo_deb_repo = "Debian_10"
elif wo_distro == 'raspbian':
if wo_platform_codename == 'stretch':
wo_deb_repo = "Raspbian_9.0"
elif wo_platform_codename == 'buster':
wo_deb_repo = "Raspbian_10"
# debian/raspbian nginx repository
wo_nginx_repo = ("deb http://download.opensuse.org"
"/repositories/home:"
"/virtubox:/WordOps/{0}/ /"
.format(wo_deb_repo))
wo_nginx = ["nginx-custom", "nginx-wo"] wo_nginx = ["nginx-custom", "nginx-wo"]
wo_nginx_key = '188C9FB063F0247A' wo_nginx_key = '188C9FB063F0247A'
@@ -111,7 +113,6 @@ class WOVariables():
# PHP repo and packages # PHP repo and packages
if wo_distro == 'ubuntu': if wo_distro == 'ubuntu':
wo_php_repo = "ppa:ondrej/php" wo_php_repo = "ppa:ondrej/php"
wo_php_key = ''
else: else:
wo_php_repo = ( wo_php_repo = (
"deb https://packages.sury.org/php/ {codename} main" "deb https://packages.sury.org/php/ {codename} main"
@@ -143,7 +144,12 @@ class WOVariables():
"10.3/debian {codename} main" "10.3/debian {codename} main"
.format(codename=wo_platform_codename)) .format(codename=wo_platform_codename))
wo_mysql = ["mariadb-server", "percona-toolkit", "python3-mysqldb"] if wo_distro == 'raspbian':
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysqldb"]
else:
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysqldb", "mariadb-backup"]
wo_mysql_client = ["mariadb-client", "python3-mysqldb"] wo_mysql_client = ["mariadb-client", "python3-mysqldb"]