Merge pull request #141 from WordOps/updating-configuration

updating configuration
This commit is contained in:
VirtuBox
2019-09-04 21:49:32 +02:00
committed by GitHub
43 changed files with 1032 additions and 782 deletions

View File

@@ -8,11 +8,22 @@ 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.10 - 2019-09-04
#### Changed
- Improve Let's Encrypt certificate issuance logging informations
- MariaDB configuration & optimization is now rendered from a template (can be protected against overwriting with .custom)
#### Fixed #### Fixed
- Fix cheat.sh install [PR #139](https://github.com/WordOps/WordOps/pull/139) - Fix cheat.sh install [PR #139](https://github.com/WordOps/WordOps/pull/139)
- sslutils error when trying to display SSL certificate expiration - sslutils error when trying to display SSL certificate expiration
- Fix cheat.sh symbolink link check before creation - Fix cheat.sh symbolic link check before creation
- subdomain detection with complex suffixes like com.br
- Fix mariadb install/upgrade when running mariadb-10.1
- Fix mariadb install/upgrade on raspbian and debian 8
- Fix mariadb tuning wrong pool_instance calculation
### v3.9.8.9 - 2019-09-03 ### v3.9.8.9 - 2019-09-03

View File

@@ -17,7 +17,7 @@
<br><img src="https://netdata.wordops.eu/netdata/api/v1/badge.svg?chart=web_log_wops.cc.requests_per_url&options=unaligned&dimensions=download&group=sum&after=-86400&label=today&units=installations&precision=0&value_color=%230055AA" alt="WordOps install" > <br><img src="https://netdata.wordops.eu/netdata/api/v1/badge.svg?chart=web_log_wops.cc.requests_per_url&options=unaligned&dimensions=download&group=sum&after=-86400&label=today&units=installations&precision=0&value_color=%230055AA" alt="WordOps install" >
<a href="https://www.codacy.com/app/VirtuBox/WordOps?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=WordOps/WordOps&amp;utm_campaign=Badge_Grade"><img src="https://api.codacy.com/project/badge/Grade/fe9100fd2c634de7882ecec17f00a11a" alt="codacy"/></a> <a href="https://www.codacy.com/app/VirtuBox/WordOps?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=WordOps/WordOps&amp;utm_campaign=Badge_Grade"><img src="https://api.codacy.com/project/badge/Grade/fe9100fd2c634de7882ecec17f00a11a" alt="codacy"/></a>
<a href="https://twitter.com/WordOps_" target="_blank"><img src="https://img.shields.io/badge/twitter-%40WordOps__-blue.svg?style=flat&logo=twitter" alt="Badge Twitter" /></a> <a href="https://twitter.com/WordOps_" target="_blank"><img src="https://img.shields.io/badge/twitter-%40WordOps__-blue.svg?style=flat&logo=twitter" alt="Badge Twitter" /></a>
<a href="https://community.wordops.net/slack" target="_blank"><img src="https://img.shields.io/badge/slack-WordOps-4A154B.svg?style=flat&logo=slack" alt="Badge Slack" /></a> <a href="https://chat.wordops.net" target="_blank"><img src="https://img.shields.io/badge/slack-WordOps-4A154B.svg?style=flat&logo=rocket.chat" alt="Badge Slack" /></a>
</p> </p>
<p align="center"> <p align="center">

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.9 - 2019-09-03 # Version 3.9.8.10 - 2019-09-04
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# CONTENTS # CONTENTS

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.9', version='3.9.8.10',
description=long_description, description=long_description,
long_description=long_description, long_description=long_description,
classifiers=[], classifiers=[],

View File

@@ -1,14 +1,16 @@
"""Clean Plugin for WordOps.""" """Clean Plugin for WordOps."""
from wo.core.shellexec import WOShellExec
from wo.core.aptget import WOAptGet
from wo.core.services import WOService
from wo.core.logging import Log
from cement.core.controller import CementBaseController, expose
from cement.core import handler, hook
import os import os
import urllib.request import urllib.request
from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose
from wo.core.aptget import WOAptGet
from wo.core.logging import Log
from wo.core.services import WOService
from wo.core.shellexec import WOShellExec
def wo_clean_hook(app): def wo_clean_hook(app):
pass pass

View File

@@ -1,21 +1,23 @@
"""Debug Plugin for WordOps""" """Debug Plugin for WordOps"""
from cement.core.controller import CementBaseController, expose
from cement.core import handler, hook
from wo.core.aptget import WOAptGet
from wo.core.shellexec import WOShellExec
from wo.core.mysql import WOMysql
from wo.core.services import WOService
from wo.core.logging import Log
from wo.cli.plugins.site_functions import logwatch
from wo.core.variables import WOVariables
from wo.core.fileutils import WOFileUtils
from pynginxconfig import NginxConfig
import os
import configparser import configparser
import glob import glob
import os
import signal import signal
from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose
from pynginxconfig import NginxConfig
from wo.cli.plugins.site_functions import logwatch
from wo.core.aptget import WOAptGet
from wo.core.fileutils import WOFileUtils
from wo.core.logging import Log
from wo.core.mysql import WOMysql
from wo.core.services import WOService
from wo.core.shellexec import WOShellExec
from wo.core.variables import WOVariables
def wo_debug_hook(app): def wo_debug_hook(app):
pass pass

View File

@@ -1,5 +1,6 @@
from cement.core.controller import CementBaseController, expose
from cement.core import handler, hook from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -1,296 +1,298 @@
"""WOInfo Plugin for WordOps""" """WOInfo Plugin for WordOps"""
from cement.core.controller import CementBaseController, expose import configparser
from cement.core import handler, hook import os
from pynginxconfig import NginxConfig
from wo.core.aptget import WOAptGet from cement.core import handler, hook
from wo.core.shellexec import WOShellExec from cement.core.controller import CementBaseController, expose
from wo.core.logging import Log from pynginxconfig import NginxConfig
import os
import configparser from wo.core.aptget import WOAptGet
from wo.core.logging import Log
from wo.core.shellexec import WOShellExec
def wo_info_hook(app):
pass
def wo_info_hook(app):
pass
class WOInfoController(CementBaseController):
class Meta:
label = 'info' class WOInfoController(CementBaseController):
stacked_on = 'base' class Meta:
stacked_type = 'nested' label = 'info'
description = ('Display configuration information related to Nginx,' stacked_on = 'base'
' PHP and MySQL') stacked_type = 'nested'
arguments = [ description = ('Display configuration information related to Nginx,'
(['--mysql'], ' PHP and MySQL')
dict(help='Get MySQL configuration information', arguments = [
action='store_true')), (['--mysql'],
(['--php'], dict(help='Get MySQL configuration information',
dict(help='Get PHP 7.2 configuration information', action='store_true')),
action='store_true')), (['--php'],
(['--php73'], dict(help='Get PHP 7.2 configuration information',
dict(help='Get PHP 7.3 configuration information', action='store_true')),
action='store_true')), (['--php73'],
(['--nginx'], dict(help='Get PHP 7.3 configuration information',
dict(help='Get Nginx configuration information', action='store_true')),
action='store_true')), (['--nginx'],
] dict(help='Get Nginx configuration information',
usage = "wo info [options]" action='store_true')),
]
@expose(hide=True) usage = "wo info [options]"
def info_nginx(self):
"""Display Nginx information""" @expose(hide=True)
version = os.popen("/usr/sbin/nginx -v 2>&1 | " def info_nginx(self):
"awk -F '/' '{print $2}' | " """Display Nginx information"""
"awk -F ' ' '{print $1}' | tr '\n' ' '").read() version = os.popen("/usr/sbin/nginx -v 2>&1 | "
allow = os.popen("grep ^allow /etc/nginx/common/acl.conf | " "awk -F '/' '{print $2}' | "
"cut -d' ' -f2 | cut -d';' -f1 | tr '\n' ' '").read() "awk -F ' ' '{print $1}' | tr '\n' ' '").read()
nc = NginxConfig() allow = os.popen("grep ^allow /etc/nginx/common/acl.conf | "
nc.loadf('/etc/nginx/nginx.conf') "cut -d' ' -f2 | cut -d';' -f1 | tr '\n' ' '").read()
user = nc.get('user')[1] nc = NginxConfig()
worker_processes = nc.get('worker_processes')[1] nc.loadf('/etc/nginx/nginx.conf')
worker_connections = nc.get([('events',), 'worker_connections'])[1] user = nc.get('user')[1]
keepalive_timeout = nc.get([('http',), 'keepalive_timeout'])[1] worker_processes = nc.get('worker_processes')[1]
fastcgi_read_timeout = nc.get([('http',), worker_connections = nc.get([('events',), 'worker_connections'])[1]
'fastcgi_read_timeout'])[1] keepalive_timeout = nc.get([('http',), 'keepalive_timeout'])[1]
client_max_body_size = nc.get([('http',), fastcgi_read_timeout = nc.get([('http',),
'client_max_body_size'])[1] 'fastcgi_read_timeout'])[1]
data = dict(version=version, allow=allow, user=user, client_max_body_size = nc.get([('http',),
worker_processes=worker_processes, 'client_max_body_size'])[1]
keepalive_timeout=keepalive_timeout, data = dict(version=version, allow=allow, user=user,
worker_connections=worker_connections, worker_processes=worker_processes,
fastcgi_read_timeout=fastcgi_read_timeout, keepalive_timeout=keepalive_timeout,
client_max_body_size=client_max_body_size) worker_connections=worker_connections,
self.app.render((data), 'info_nginx.mustache') fastcgi_read_timeout=fastcgi_read_timeout,
client_max_body_size=client_max_body_size)
@expose(hide=True) self.app.render((data), 'info_nginx.mustache')
def info_php(self):
"""Display PHP information""" @expose(hide=True)
version = os.popen("/usr/bin/php7.2 -v 2>/dev/null | " def info_php(self):
"head -n1 | cut -d' ' -f2 |" """Display PHP information"""
" cut -d'+' -f1 | tr -d '\n'").read version = os.popen("/usr/bin/php7.2 -v 2>/dev/null | "
config = configparser.ConfigParser() "head -n1 | cut -d' ' -f2 |"
config.read('/etc/{0}/fpm/php.ini'.format("php/7.2")) " cut -d'+' -f1 | tr -d '\n'").read
expose_php = config['PHP']['expose_php'] config = configparser.ConfigParser()
memory_limit = config['PHP']['memory_limit'] config.read('/etc/{0}/fpm/php.ini'.format("php/7.2"))
post_max_size = config['PHP']['post_max_size'] expose_php = config['PHP']['expose_php']
upload_max_filesize = config['PHP']['upload_max_filesize'] memory_limit = config['PHP']['memory_limit']
max_execution_time = config['PHP']['max_execution_time'] post_max_size = config['PHP']['post_max_size']
upload_max_filesize = config['PHP']['upload_max_filesize']
config.read('/etc/{0}/fpm/pool.d/www.conf'.format("php/7.2")) max_execution_time = config['PHP']['max_execution_time']
www_listen = config['www']['listen']
www_ping_path = config['www']['ping.path'] config.read('/etc/{0}/fpm/pool.d/www.conf'.format("php/7.2"))
www_pm_status_path = config['www']['pm.status_path'] www_listen = config['www']['listen']
www_pm = config['www']['pm'] www_ping_path = config['www']['ping.path']
www_pm_max_requests = config['www']['pm.max_requests'] www_pm_status_path = config['www']['pm.status_path']
www_pm_max_children = config['www']['pm.max_children'] www_pm = config['www']['pm']
www_pm_start_servers = config['www']['pm.start_servers'] www_pm_max_requests = config['www']['pm.max_requests']
www_pm_min_spare_servers = config['www']['pm.min_spare_servers'] www_pm_max_children = config['www']['pm.max_children']
www_pm_max_spare_servers = config['www']['pm.max_spare_servers'] www_pm_start_servers = config['www']['pm.start_servers']
www_request_terminate_time = (config['www'] www_pm_min_spare_servers = config['www']['pm.min_spare_servers']
['request_terminate_timeout']) www_pm_max_spare_servers = config['www']['pm.max_spare_servers']
try: www_request_terminate_time = (config['www']
www_xdebug = (config['www']['php_admin_flag[xdebug.profiler_enable' ['request_terminate_timeout'])
'_trigger]']) try:
except Exception as e: www_xdebug = (config['www']['php_admin_flag[xdebug.profiler_enable'
Log.debug(self, "{0}".format(e)) '_trigger]'])
www_xdebug = 'off' except Exception as e:
Log.debug(self, "{0}".format(e))
config.read('/etc/{0}/fpm/pool.d/debug.conf'.format("php/7.2")) www_xdebug = 'off'
debug_listen = config['debug']['listen']
debug_ping_path = config['debug']['ping.path'] config.read('/etc/{0}/fpm/pool.d/debug.conf'.format("php/7.2"))
debug_pm_status_path = config['debug']['pm.status_path'] debug_listen = config['debug']['listen']
debug_pm = config['debug']['pm'] debug_ping_path = config['debug']['ping.path']
debug_pm_max_requests = config['debug']['pm.max_requests'] debug_pm_status_path = config['debug']['pm.status_path']
debug_pm_max_children = config['debug']['pm.max_children'] debug_pm = config['debug']['pm']
debug_pm_start_servers = config['debug']['pm.start_servers'] debug_pm_max_requests = config['debug']['pm.max_requests']
debug_pm_min_spare_servers = config['debug']['pm.min_spare_servers'] debug_pm_max_children = config['debug']['pm.max_children']
debug_pm_max_spare_servers = config['debug']['pm.max_spare_servers'] debug_pm_start_servers = config['debug']['pm.start_servers']
debug_request_terminate = (config['debug'] debug_pm_min_spare_servers = config['debug']['pm.min_spare_servers']
['request_terminate_timeout']) debug_pm_max_spare_servers = config['debug']['pm.max_spare_servers']
try: debug_request_terminate = (config['debug']
debug_xdebug = (config['debug']['php_admin_flag[xdebug.profiler_' ['request_terminate_timeout'])
'enable_trigger]']) try:
except Exception as e: debug_xdebug = (config['debug']['php_admin_flag[xdebug.profiler_'
Log.debug(self, "{0}".format(e)) 'enable_trigger]'])
debug_xdebug = 'off' except Exception as e:
Log.debug(self, "{0}".format(e))
data = dict(version=version, expose_php=expose_php, debug_xdebug = 'off'
memory_limit=memory_limit, post_max_size=post_max_size,
upload_max_filesize=upload_max_filesize, data = dict(version=version, expose_php=expose_php,
max_execution_time=max_execution_time, memory_limit=memory_limit, post_max_size=post_max_size,
www_listen=www_listen, www_ping_path=www_ping_path, upload_max_filesize=upload_max_filesize,
www_pm_status_path=www_pm_status_path, www_pm=www_pm, max_execution_time=max_execution_time,
www_pm_max_requests=www_pm_max_requests, www_listen=www_listen, www_ping_path=www_ping_path,
www_pm_max_children=www_pm_max_children, www_pm_status_path=www_pm_status_path, www_pm=www_pm,
www_pm_start_servers=www_pm_start_servers, www_pm_max_requests=www_pm_max_requests,
www_pm_min_spare_servers=www_pm_min_spare_servers, www_pm_max_children=www_pm_max_children,
www_pm_max_spare_servers=www_pm_max_spare_servers, www_pm_start_servers=www_pm_start_servers,
www_request_terminate_timeout=www_request_terminate_time, www_pm_min_spare_servers=www_pm_min_spare_servers,
www_xdebug_profiler_enable_trigger=www_xdebug, www_pm_max_spare_servers=www_pm_max_spare_servers,
debug_listen=debug_listen, debug_ping_path=debug_ping_path, www_request_terminate_timeout=www_request_terminate_time,
debug_pm_status_path=debug_pm_status_path, www_xdebug_profiler_enable_trigger=www_xdebug,
debug_pm=debug_pm, debug_listen=debug_listen, debug_ping_path=debug_ping_path,
debug_pm_max_requests=debug_pm_max_requests, debug_pm_status_path=debug_pm_status_path,
debug_pm_max_children=debug_pm_max_children, debug_pm=debug_pm,
debug_pm_start_servers=debug_pm_start_servers, debug_pm_max_requests=debug_pm_max_requests,
debug_pm_min_spare_servers=debug_pm_min_spare_servers, debug_pm_max_children=debug_pm_max_children,
debug_pm_max_spare_servers=debug_pm_max_spare_servers, debug_pm_start_servers=debug_pm_start_servers,
debug_request_terminate_timeout=debug_request_terminate, debug_pm_min_spare_servers=debug_pm_min_spare_servers,
debug_xdebug_profiler_enable_trigger=debug_xdebug) debug_pm_max_spare_servers=debug_pm_max_spare_servers,
self.app.render((data), 'info_php.mustache') debug_request_terminate_timeout=debug_request_terminate,
debug_xdebug_profiler_enable_trigger=debug_xdebug)
@expose(hide=True) self.app.render((data), 'info_php.mustache')
def info_php73(self):
"""Display PHP information""" @expose(hide=True)
version = os.popen("/usr/bin/php7.3 -v 2>/dev/null | " def info_php73(self):
"head -n1 | cut -d' ' -f2 |" """Display PHP information"""
" cut -d'+' -f1 | tr -d '\n'").read version = os.popen("/usr/bin/php7.3 -v 2>/dev/null | "
config = configparser.ConfigParser() "head -n1 | cut -d' ' -f2 |"
config.read('/etc/php/7.3/fpm/php.ini') " cut -d'+' -f1 | tr -d '\n'").read
expose_php = config['PHP']['expose_php'] config = configparser.ConfigParser()
memory_limit = config['PHP']['memory_limit'] config.read('/etc/php/7.3/fpm/php.ini')
post_max_size = config['PHP']['post_max_size'] expose_php = config['PHP']['expose_php']
upload_max_filesize = config['PHP']['upload_max_filesize'] memory_limit = config['PHP']['memory_limit']
max_execution_time = config['PHP']['max_execution_time'] post_max_size = config['PHP']['post_max_size']
upload_max_filesize = config['PHP']['upload_max_filesize']
config.read('/etc/php/7.3/fpm/pool.d/www.conf') max_execution_time = config['PHP']['max_execution_time']
www_listen = config['www']['listen']
www_ping_path = config['www']['ping.path'] config.read('/etc/php/7.3/fpm/pool.d/www.conf')
www_pm_status_path = config['www']['pm.status_path'] www_listen = config['www']['listen']
www_pm = config['www']['pm'] www_ping_path = config['www']['ping.path']
www_pm_max_requests = config['www']['pm.max_requests'] www_pm_status_path = config['www']['pm.status_path']
www_pm_max_children = config['www']['pm.max_children'] www_pm = config['www']['pm']
www_pm_start_servers = config['www']['pm.start_servers'] www_pm_max_requests = config['www']['pm.max_requests']
www_pm_min_spare_servers = config['www']['pm.min_spare_servers'] www_pm_max_children = config['www']['pm.max_children']
www_pm_max_spare_servers = config['www']['pm.max_spare_servers'] www_pm_start_servers = config['www']['pm.start_servers']
www_request_terminate_time = (config['www'] www_pm_min_spare_servers = config['www']['pm.min_spare_servers']
['request_terminate_timeout']) www_pm_max_spare_servers = config['www']['pm.max_spare_servers']
try: www_request_terminate_time = (config['www']
www_xdebug = (config['www']['php_admin_flag[xdebug.profiler_enable' ['request_terminate_timeout'])
'_trigger]']) try:
except Exception as e: www_xdebug = (config['www']['php_admin_flag[xdebug.profiler_enable'
Log.debug(self, "{0}".format(e)) '_trigger]'])
www_xdebug = 'off' except Exception as e:
Log.debug(self, "{0}".format(e))
config.read('/etc/php/7.3/fpm/pool.d/debug.conf') www_xdebug = 'off'
debug_listen = config['debug']['listen']
debug_ping_path = config['debug']['ping.path'] config.read('/etc/php/7.3/fpm/pool.d/debug.conf')
debug_pm_status_path = config['debug']['pm.status_path'] debug_listen = config['debug']['listen']
debug_pm = config['debug']['pm'] debug_ping_path = config['debug']['ping.path']
debug_pm_max_requests = config['debug']['pm.max_requests'] debug_pm_status_path = config['debug']['pm.status_path']
debug_pm_max_children = config['debug']['pm.max_children'] debug_pm = config['debug']['pm']
debug_pm_start_servers = config['debug']['pm.start_servers'] debug_pm_max_requests = config['debug']['pm.max_requests']
debug_pm_min_spare_servers = config['debug']['pm.min_spare_servers'] debug_pm_max_children = config['debug']['pm.max_children']
debug_pm_max_spare_servers = config['debug']['pm.max_spare_servers'] debug_pm_start_servers = config['debug']['pm.start_servers']
debug_request_terminate = (config['debug'] debug_pm_min_spare_servers = config['debug']['pm.min_spare_servers']
['request_terminate_timeout']) debug_pm_max_spare_servers = config['debug']['pm.max_spare_servers']
try: debug_request_terminate = (config['debug']
debug_xdebug = (config['debug']['php_admin_flag[xdebug.profiler_' ['request_terminate_timeout'])
'enable_trigger]']) try:
except Exception as e: debug_xdebug = (config['debug']['php_admin_flag[xdebug.profiler_'
Log.debug(self, "{0}".format(e)) 'enable_trigger]'])
debug_xdebug = 'off' except Exception as e:
Log.debug(self, "{0}".format(e))
data = dict(version=version, expose_php=expose_php, debug_xdebug = 'off'
memory_limit=memory_limit, post_max_size=post_max_size,
upload_max_filesize=upload_max_filesize, data = dict(version=version, expose_php=expose_php,
max_execution_time=max_execution_time, memory_limit=memory_limit, post_max_size=post_max_size,
www_listen=www_listen, www_ping_path=www_ping_path, upload_max_filesize=upload_max_filesize,
www_pm_status_path=www_pm_status_path, www_pm=www_pm, max_execution_time=max_execution_time,
www_pm_max_requests=www_pm_max_requests, www_listen=www_listen, www_ping_path=www_ping_path,
www_pm_max_children=www_pm_max_children, www_pm_status_path=www_pm_status_path, www_pm=www_pm,
www_pm_start_servers=www_pm_start_servers, www_pm_max_requests=www_pm_max_requests,
www_pm_min_spare_servers=www_pm_min_spare_servers, www_pm_max_children=www_pm_max_children,
www_pm_max_spare_servers=www_pm_max_spare_servers, www_pm_start_servers=www_pm_start_servers,
www_request_terminate_timeout=www_request_terminate_time, www_pm_min_spare_servers=www_pm_min_spare_servers,
www_xdebug_profiler_enable_trigger=www_xdebug, www_pm_max_spare_servers=www_pm_max_spare_servers,
debug_listen=debug_listen, debug_ping_path=debug_ping_path, www_request_terminate_timeout=www_request_terminate_time,
debug_pm_status_path=debug_pm_status_path, www_xdebug_profiler_enable_trigger=www_xdebug,
debug_pm=debug_pm, debug_listen=debug_listen, debug_ping_path=debug_ping_path,
debug_pm_max_requests=debug_pm_max_requests, debug_pm_status_path=debug_pm_status_path,
debug_pm_max_children=debug_pm_max_children, debug_pm=debug_pm,
debug_pm_start_servers=debug_pm_start_servers, debug_pm_max_requests=debug_pm_max_requests,
debug_pm_min_spare_servers=debug_pm_min_spare_servers, debug_pm_max_children=debug_pm_max_children,
debug_pm_max_spare_servers=debug_pm_max_spare_servers, debug_pm_start_servers=debug_pm_start_servers,
debug_request_terminate_timeout=debug_request_terminate, debug_pm_min_spare_servers=debug_pm_min_spare_servers,
debug_xdebug_profiler_enable_trigger=debug_xdebug) debug_pm_max_spare_servers=debug_pm_max_spare_servers,
self.app.render((data), 'info_php.mustache') debug_request_terminate_timeout=debug_request_terminate,
debug_xdebug_profiler_enable_trigger=debug_xdebug)
@expose(hide=True) self.app.render((data), 'info_php.mustache')
def info_mysql(self):
"""Display MySQL information""" @expose(hide=True)
version = os.popen("/usr/bin/mysql -V | awk '{print($5)}' | " def info_mysql(self):
"cut -d ',' " """Display MySQL information"""
"-f1 | tr -d '\n'").read() version = os.popen("/usr/bin/mysql -V | awk '{print($5)}' | "
host = "localhost" "cut -d ',' "
port = os.popen("/usr/bin/mysql -e \"show variables\" | " "-f1 | tr -d '\n'").read()
"/bin/grep ^port | awk " host = "localhost"
"'{print($2)}' | tr -d '\n'").read() port = os.popen("/usr/bin/mysql -e \"show variables\" | "
wait_timeout = os.popen("/usr/bin/mysql -e \"show variables\" | grep " "/bin/grep ^port | awk "
"^wait_timeout | awk '{print($2)}' | " "'{print($2)}' | tr -d '\n'").read()
"tr -d '\n'").read() wait_timeout = os.popen("/usr/bin/mysql -e \"show variables\" | grep "
interactive_timeout = os.popen("/usr/bin/mysql -e " "^wait_timeout | awk '{print($2)}' | "
"\"show variables\" | grep " "tr -d '\n'").read()
"^interactive_timeout | awk " interactive_timeout = os.popen("/usr/bin/mysql -e "
"'{print($2)}' | tr -d '\n'").read() "\"show variables\" | grep "
max_used_connections = os.popen("/usr/bin/mysql -e " "^interactive_timeout | awk "
"\"show global status\" | " "'{print($2)}' | tr -d '\n'").read()
"grep Max_used_connections | awk " max_used_connections = os.popen("/usr/bin/mysql -e "
"'{print($2)}' | tr -d '\n'").read() "\"show global status\" | "
datadir = os.popen("/usr/bin/mysql -e \"show variables\" | " "grep Max_used_connections | awk "
"/bin/grep datadir | awk" "'{print($2)}' | tr -d '\n'").read()
" '{print($2)}' | tr -d '\n'").read() datadir = os.popen("/usr/bin/mysql -e \"show variables\" | "
socket = os.popen("/usr/bin/mysql -e \"show variables\" | " "/bin/grep datadir | awk"
"/bin/grep \"^socket\" | " " '{print($2)}' | tr -d '\n'").read()
"awk '{print($2)}' | tr -d '\n'").read() socket = os.popen("/usr/bin/mysql -e \"show variables\" | "
data = dict(version=version, host=host, port=port, "/bin/grep \"^socket\" | "
wait_timeout=wait_timeout, "awk '{print($2)}' | tr -d '\n'").read()
interactive_timeout=interactive_timeout, data = dict(version=version, host=host, port=port,
max_used_connections=max_used_connections, wait_timeout=wait_timeout,
datadir=datadir, socket=socket) interactive_timeout=interactive_timeout,
self.app.render((data), 'info_mysql.mustache') max_used_connections=max_used_connections,
datadir=datadir, socket=socket)
@expose(hide=True) self.app.render((data), 'info_mysql.mustache')
def default(self):
"""default function for info""" @expose(hide=True)
if (not self.app.pargs.nginx and not self.app.pargs.php and def default(self):
not self.app.pargs.mysql and not self.app.pargs.php73): """default function for info"""
self.app.pargs.nginx = True if (not self.app.pargs.nginx and not self.app.pargs.php and
self.app.pargs.php = True not self.app.pargs.mysql and not self.app.pargs.php73):
self.app.pargs.mysql = True self.app.pargs.nginx = True
if WOAptGet.is_installed(self, 'php7.3-fpm'): self.app.pargs.php = True
self.app.pargs.php73 = True self.app.pargs.mysql = True
if WOAptGet.is_installed(self, 'php7.3-fpm'):
if self.app.pargs.nginx: self.app.pargs.php73 = True
if (WOAptGet.is_installed(self, 'nginx-custom') or
WOAptGet.is_installed(self, 'nginx-wo')): if self.app.pargs.nginx:
self.info_nginx() if (WOAptGet.is_installed(self, 'nginx-custom') or
else: WOAptGet.is_installed(self, 'nginx-wo')):
Log.error(self, "Nginx is not installed") self.info_nginx()
else:
if self.app.pargs.php: Log.error(self, "Nginx is not installed")
if WOAptGet.is_installed(self, 'php7.2-fpm'):
self.info_php() if self.app.pargs.php:
else: if WOAptGet.is_installed(self, 'php7.2-fpm'):
Log.error(self, "PHP 7.2 is not installed") self.info_php()
else:
if self.app.pargs.php73: Log.error(self, "PHP 7.2 is not installed")
if WOAptGet.is_installed(self, 'php7.3-fpm'):
self.info_php73() if self.app.pargs.php73:
else: if WOAptGet.is_installed(self, 'php7.3-fpm'):
Log.error(self, "PHP 7.3 is not installed") self.info_php73()
else:
if self.app.pargs.mysql: Log.error(self, "PHP 7.3 is not installed")
if WOShellExec.cmd_exec(self, "/usr/bin/mysqladmin ping"):
self.info_mysql() if self.app.pargs.mysql:
else: if WOShellExec.cmd_exec(self, "/usr/bin/mysqladmin ping"):
Log.error(self, "MySQL is not installed") self.info_mysql()
else:
Log.error(self, "MySQL is not installed")
def load(app):
# register the plugin class.. this only happens if the plugin is enabled
handler.register(WOInfoController) def load(app):
# register the plugin class.. this only happens if the plugin is enabled
# register a hook (function) to run after arguments are parsed. handler.register(WOInfoController)
hook.register('post_argument_parsing', wo_info_hook)
# register a hook (function) to run after arguments are parsed.
hook.register('post_argument_parsing', wo_info_hook)

View File

@@ -6,6 +6,7 @@ import os
from cement.core import handler, hook from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose from cement.core.controller import CementBaseController, expose
from wo.cli.plugins.site_functions import logwatch from wo.cli.plugins.site_functions import logwatch
from wo.core.fileutils import WOFileUtils from wo.core.fileutils import WOFileUtils
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -2,6 +2,7 @@
from cement.core import handler, hook from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose from cement.core.controller import CementBaseController, expose
from wo.core.aptget import WOAptGet from wo.core.aptget import WOAptGet
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -1,4 +1,5 @@
from sqlalchemy import Column, DateTime, String, Integer, Boolean, func from sqlalchemy import Boolean, Column, DateTime, Integer, String, func
from wo.core.database import Base from wo.core.database import Base

View File

@@ -1,13 +1,15 @@
from cement.core.controller import CementBaseController, expose import getpass
import random
import string
from cement.core import handler, hook from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose
from wo.core.git import WOGit
from wo.core.logging import Log
from wo.core.services import WOService
from wo.core.shellexec import WOShellExec from wo.core.shellexec import WOShellExec
from wo.core.variables import WOVariables from wo.core.variables import WOVariables
from wo.core.logging import Log
from wo.core.git import WOGit
from wo.core.services import WOService
import string
import random
import getpass
def wo_secure_hook(app): def wo_secure_hook(app):

View File

@@ -10,7 +10,7 @@ from cement.core.controller import CementBaseController, expose
from wo.cli.plugins.site_functions import * from wo.cli.plugins.site_functions import *
from wo.cli.plugins.sitedb import (addNewSite, deleteSiteInfo, getAllsites, from wo.cli.plugins.sitedb import (addNewSite, deleteSiteInfo, getAllsites,
getSiteInfo, updateSiteInfo) getSiteInfo, updateSiteInfo)
from wo.core.domainvalidate import GetDomainlevel, ValidateDomain from wo.core.domainvalidate import DMN
from wo.core.fileutils import WOFileUtils from wo.core.fileutils import WOFileUtils
from wo.core.git import WOGit from wo.core.git import WOGit
from wo.core.logging import Log from wo.core.logging import Log
@@ -57,7 +57,7 @@ class WOSiteController(CementBaseController):
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
# validate domain name # validate domain name
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, 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):
@@ -94,7 +94,7 @@ class WOSiteController(CementBaseController):
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')
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, 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))
@@ -134,8 +134,8 @@ class WOSiteController(CementBaseController):
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')
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, pargs.site_name)
(wo_domain_type, wo_root_domain) = GetDomainlevel(wo_domain) (wo_domain_type, wo_root_domain) = DMN.getdomainlevel(self, wo_domain)
wo_db_name = '' wo_db_name = ''
wo_db_user = '' wo_db_user = ''
wo_db_pass = '' wo_db_pass = ''
@@ -163,9 +163,9 @@ class WOSiteController(CementBaseController):
if os.path.islink("{0}/conf/nginx/ssl.conf" if os.path.islink("{0}/conf/nginx/ssl.conf"
.format(wo_site_webroot)): .format(wo_site_webroot)):
sslexpiry = str( sslexpiry = str(
SSL.getExpirationDate(self, wo_root_domain)) SSL.getexpirationdays(self, wo_root_domain))
else: else:
sslexpiry = str(SSL.getExpirationDate(self, wo_domain)) sslexpiry = str(SSL.getexpirationdays(self, wo_domain))
else: else:
sslprovider = '' sslprovider = ''
sslexpiry = '' sslexpiry = ''
@@ -186,7 +186,7 @@ class WOSiteController(CementBaseController):
def log(self): def log(self):
pargs = self.app.pargs pargs = self.app.pargs
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, 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):
@@ -208,7 +208,7 @@ class WOSiteController(CementBaseController):
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
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, 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))
@@ -239,7 +239,7 @@ class WOSiteController(CementBaseController):
Log.error(self, 'Unable to read input, please try again') Log.error(self, 'Unable to read input, please try again')
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, 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))
@@ -280,7 +280,7 @@ class WOSiteEditController(CementBaseController):
Log.error(self, 'Unable to read input, Please try again') Log.error(self, 'Unable to read input, Please try again')
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, 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))
@@ -425,7 +425,7 @@ class WOSiteCreateController(CementBaseController):
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_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, pargs.site_name)
if not wo_domain.strip(): if not wo_domain.strip():
Log.error(self, "Invalid domain name, " Log.error(self, "Invalid domain name, "
"Provide valid domain name") "Provide valid domain name")
@@ -718,7 +718,7 @@ class WOSiteCreateController(CementBaseController):
"`tail /var/log/wo/wordops.log` and please try again") "`tail /var/log/wo/wordops.log` and please try again")
if pargs.letsencrypt: if pargs.letsencrypt:
(wo_domain_type, wo_root_domain) = GetDomainlevel(wo_domain) (wo_domain_type, wo_root_domain) = DMN.getdomainlevel(self, wo_domain)
data['letsencrypt'] = True data['letsencrypt'] = True
letsencrypt = True letsencrypt = True
if data['letsencrypt'] is True: if data['letsencrypt'] is True:
@@ -745,9 +745,9 @@ class WOSiteCreateController(CementBaseController):
# check if a wildcard cert for the root domain exist # check if a wildcard cert for the root domain exist
Log.debug(self, "checkWildcardExist on *.{0}" Log.debug(self, "checkWildcardExist on *.{0}"
.format(wo_root_domain)) .format(wo_root_domain))
isWildcard = checkWildcardExist(self, wo_root_domain) iswildcard = SSL.checkwildcardexist(self, wo_root_domain)
Log.debug(self, "isWildcard = {0}".format(isWildcard)) Log.debug(self, "iswildcard = {0}".format(iswildcard))
if isWildcard: if iswildcard:
Log.info(self, "Using existing Wildcard SSL " Log.info(self, "Using existing Wildcard SSL "
"certificate from {0} to secure {1}" "certificate from {0} to secure {1}"
.format(wo_root_domain, wo_domain)) .format(wo_root_domain, wo_domain))
@@ -769,7 +769,7 @@ class WOSiteCreateController(CementBaseController):
if pargs.hsts: if pargs.hsts:
setupHsts(self, wo_domain) setupHsts(self, wo_domain)
site_url_https(self, wo_domain) SSL.siteurlhttps(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. "
"check issues with `nginx -t` command") "check issues with `nginx -t` command")
@@ -931,7 +931,7 @@ class WOSiteUpdateController(CementBaseController):
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_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, pargs.site_name)
wo_site_webroot = WOVariables.wo_webroot + wo_domain wo_site_webroot = WOVariables.wo_webroot + wo_domain
check_site = getSiteInfo(self, wo_domain) check_site = getSiteInfo(self, wo_domain)
@@ -1004,21 +1004,23 @@ class WOSiteUpdateController(CementBaseController):
data['currcachetype'] = oldcachetype data['currcachetype'] = oldcachetype
if stype == 'php': if stype == 'php':
data = dict(site_name=wo_domain, www_domain=wo_www_domain, data = dict(
static=False, basic=True, wp=False, wpfc=False, site_name=wo_domain, www_domain=wo_www_domain,
wpsc=False, wpredis=False, wprocket=False, wpce=False, static=False, basic=True, wp=False, wpfc=False,
multisite=False, wpsubdir=False, webroot=wo_site_webroot, wpsc=False, wpredis=False, wprocket=False, wpce=False,
currsitetype=oldsitetype, currcachetype=oldcachetype) multisite=False, wpsubdir=False, webroot=wo_site_webroot,
currsitetype=oldsitetype, currcachetype=oldcachetype)
elif stype in ['mysql', 'wp', 'wpsubdir', 'wpsubdomain']: elif stype in ['mysql', 'wp', 'wpsubdir', 'wpsubdomain']:
data = dict(site_name=wo_domain, www_domain=wo_www_domain, data = dict(
static=False, basic=True, wp=False, wpfc=False, site_name=wo_domain, www_domain=wo_www_domain,
wpsc=False, wpredis=False, wprocket=False, wpce=False, static=False, basic=True, wp=False, wpfc=False,
multisite=False, wpsubdir=False, webroot=wo_site_webroot, wpsc=False, wpredis=False, wprocket=False, wpce=False,
wo_db_name='', wo_db_user='', wo_db_pass='', multisite=False, wpsubdir=False, webroot=wo_site_webroot,
wo_db_host='', wo_db_name='', wo_db_user='', wo_db_pass='',
currsitetype=oldsitetype, currcachetype=oldcachetype) wo_db_host='',
currsitetype=oldsitetype, currcachetype=oldcachetype)
if stype in ['wp', 'wpsubdir', 'wpsubdomain']: if stype in ['wp', 'wpsubdir', 'wpsubdomain']:
data['wp'] = True data['wp'] = True
@@ -1031,10 +1033,11 @@ class WOSiteUpdateController(CementBaseController):
if pargs.php73: if pargs.php73:
if not data: if not data:
data = dict(site_name=wo_domain, www_domain=wo_www_domain, data = dict(
currsitetype=oldsitetype, site_name=wo_domain, www_domain=wo_www_domain,
currcachetype=oldcachetype, currsitetype=oldsitetype,
webroot=wo_site_webroot) currcachetype=oldcachetype,
webroot=wo_site_webroot)
stype = oldsitetype stype = oldsitetype
cache = oldcachetype cache = oldcachetype
if oldsitetype == 'html' or oldsitetype == 'proxy': if oldsitetype == 'html' or oldsitetype == 'proxy':
@@ -1126,7 +1129,7 @@ class WOSiteUpdateController(CementBaseController):
pargs.php73 = False pargs.php73 = False
if pargs.letsencrypt: if pargs.letsencrypt:
(wo_domain_type, wo_root_domain) = GetDomainlevel(wo_domain) (wo_domain_type, wo_root_domain) = DMN.getdomainlevel(self, wo_domain)
if pargs.letsencrypt == 'on': if pargs.letsencrypt == 'on':
data['letsencrypt'] = True data['letsencrypt'] = True
letsencrypt = True letsencrypt = True
@@ -1174,7 +1177,7 @@ class WOSiteUpdateController(CementBaseController):
# --letsencrypt=renew code goes here # --letsencrypt=renew code goes here
if pargs.letsencrypt == "renew" and not pargs.all: if pargs.letsencrypt == "renew" and not pargs.all:
expiry_days = SSL.getExpirationDays(self, wo_domain) expiry_days = SSL.getexpirationdays(self, wo_domain)
min_expiry_days = 45 min_expiry_days = 45
if check_ssl: if check_ssl:
if (expiry_days <= min_expiry_days): if (expiry_days <= min_expiry_days):
@@ -1196,12 +1199,12 @@ class WOSiteUpdateController(CementBaseController):
"check issues with `nginx -t` command") "check issues with `nginx -t` command")
Log.info(self, "SUCCESS: Certificate was successfully renewed For" Log.info(self, "SUCCESS: Certificate was successfully renewed For"
" https://{0}".format(wo_domain)) " https://{0}".format(wo_domain))
if (SSL.getExpirationDays(self, wo_domain) > 0): if (SSL.getexpirationdays(self, wo_domain) > 0):
Log.info(self, "Your cert will expire within " + Log.info(self, "Your cert will expire within " +
str(SSL.getExpirationDays(self, wo_domain)) + str(SSL.getexpirationdays(self, wo_domain)) +
" days.") " days.")
Log.info(self, "Expiration date: " + Log.info(self, "Expiration date: " +
str(SSL.getExpirationDate(self, wo_domain))) str(SSL.getexpirationdate(self, wo_domain)))
else: else:
Log.warn( Log.warn(
@@ -1236,12 +1239,12 @@ class WOSiteUpdateController(CementBaseController):
self, "You have more than 45 days with the current " self, "You have more than 45 days with the current "
"certificate - refusing to run.\n") "certificate - refusing to run.\n")
if (SSL.getExpirationDays(self, wo_domain) > 0): if (SSL.getexpirationdays(self, wo_domain) > 0):
Log.info(self, "Your cert will expire within " + Log.info(self, "Your cert will expire within " +
str(SSL.getExpirationDays(self, wo_domain)) + str(SSL.getexpirationdays(self, wo_domain)) +
" days.") " days.")
Log.info(self, "Expiration date: \n\n" + Log.info(self, "Expiration date: \n\n" +
str(SSL.getExpirationDate(self, wo_domain))) str(SSL.getexpirationdate(self, wo_domain)))
return 0 return 0
# else: # else:
# Log.warn(self, "Your cert already EXPIRED ! # Log.warn(self, "Your cert already EXPIRED !
@@ -1354,11 +1357,11 @@ class WOSiteUpdateController(CementBaseController):
# check if a wildcard cert for the root domain exist # check if a wildcard cert for the root domain exist
Log.debug(self, "checkWildcardExist on *.{0}" Log.debug(self, "checkWildcardExist on *.{0}"
.format(wo_root_domain)) .format(wo_root_domain))
isWildcard = checkWildcardExist(self, wo_root_domain) iswildcard = SSL.checkwildcardexist(self, wo_root_domain)
Log.debug(self, "isWildcard = {0}".format(isWildcard)) Log.debug(self, "iswildcard = {0}".format(iswildcard))
if not os.path.isfile("{0}/conf/nginx/ssl.conf.disabled"): if not os.path.isfile("{0}/conf/nginx/ssl.conf.disabled"):
if wo_subdomain: if wo_subdomain:
if isWildcard: if iswildcard:
Log.info(self, "Using existing Wildcard SSL " Log.info(self, "Using existing Wildcard SSL "
"certificate from {0} to secure {1}" "certificate from {0} to secure {1}"
.format(wo_root_domain, wo_domain)) .format(wo_root_domain, wo_domain))
@@ -1375,9 +1378,6 @@ class WOSiteUpdateController(CementBaseController):
else: else:
setupLetsEncrypt(self, wo_domain, wo_subdomain, setupLetsEncrypt(self, wo_domain, wo_subdomain,
wo_wildcard, wo_dns, wo_acme_dns) wo_wildcard, wo_dns, wo_acme_dns)
httpsRedirect(self, wo_domain, True, wo_wildcard)
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),
@@ -1389,8 +1389,8 @@ class WOSiteUpdateController(CementBaseController):
'/etc/nginx/conf.d/force-ssl-{0}.conf' '/etc/nginx/conf.d/force-ssl-{0}.conf'
.format(wo_domain)) .format(wo_domain))
httpsRedirect(self, wo_domain, True, wo_wildcard) httpsRedirect(self, wo_domain, True, wo_wildcard)
site_url_https(self, wo_domain) SSL.siteurlhttps(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. "
@@ -1398,20 +1398,20 @@ class WOSiteUpdateController(CementBaseController):
Log.info(self, "Congratulations! Successfully " Log.info(self, "Congratulations! Successfully "
"Configured SSL for Site " "Configured SSL for Site "
" https://{0}".format(wo_domain)) " https://{0}".format(wo_domain))
if wo_subdomain and isWildcard: if wo_subdomain and iswildcard:
if (SSL.getExpirationDays(self, wo_root_domain) > 0): if (SSL.getexpirationdays(self, wo_root_domain) > 0):
Log.info( Log.info(
self, "Your cert will expire within " + self, "Your cert will expire within " +
str(SSL.getExpirationDays(self, wo_root_domain)) + str(SSL.getexpirationdays(self, wo_root_domain)) +
" days.") " days.")
else: else:
Log.warn( Log.warn(
self, "Your cert already EXPIRED ! " self, "Your cert already EXPIRED ! "
".PLEASE renew soon . ") ".PLEASE renew soon . ")
else: else:
if (SSL.getExpirationDays(self, wo_domain) > 0): if (SSL.getexpirationdays(self, wo_domain) > 0):
Log.info(self, "Your cert will expire within " + Log.info(self, "Your cert will expire within " +
str(SSL.getExpirationDays(self, wo_domain)) + str(SSL.getexpirationdays(self, wo_domain)) +
" days.") " days.")
else: else:
Log.warn( Log.warn(
@@ -1575,26 +1575,27 @@ class WOSiteUpdateController(CementBaseController):
(data['wpfc'])) or (oldsitetype == 'wp' and (data['wpfc'])) or (oldsitetype == 'wp' and
data['multisite'] and data['wpfc'])): data['multisite'] and data['wpfc'])):
try: try:
plugin_data_object = {"log_level": "INFO", plugin_data_object = {
"log_filesize": 5, "log_level": "INFO",
"enable_purge": 1, "log_filesize": 5,
"enable_map": "0", "enable_purge": 1,
"enable_log": 0, "enable_map": "0",
"enable_stamp": 1, "enable_log": 0,
"purge_homepage_on_new": 1, "enable_stamp": 1,
"purge_homepage_on_edit": 1, "purge_homepage_on_new": 1,
"purge_homepage_on_del": 1, "purge_homepage_on_edit": 1,
"purge_archive_on_new": 1, "purge_homepage_on_del": 1,
"purge_archive_on_edit": 0, "purge_archive_on_new": 1,
"purge_archive_on_del": 0, "purge_archive_on_edit": 0,
"purge_archive_on_new_comment": 0, "purge_archive_on_del": 0,
"purge_archive_on_deleted_comment": 0, "purge_archive_on_new_comment": 0,
"purge_page_on_mod": 1, "purge_archive_on_deleted_comment": 0,
"purge_page_on_new_comment": 1, "purge_page_on_mod": 1,
"purge_page_on_deleted_comment": 1, "purge_page_on_new_comment": 1,
"cache_method": "enable_fastcgi", "purge_page_on_deleted_comment": 1,
"purge_method": "get_request", "cache_method": "enable_fastcgi",
"redis_hostname": "127.0.0.1", "purge_method": "get_request",
"redis_hostname": "127.0.0.1",
"redis_port": "6379", "redis_port": "6379",
"redis_prefix": "nginx-cache:"} "redis_prefix": "nginx-cache:"}
plugin_data = json.dumps(plugin_data_object) plugin_data = json.dumps(plugin_data_object)
@@ -1616,26 +1617,27 @@ class WOSiteUpdateController(CementBaseController):
data['multisite'] and data['multisite'] and
data['wpredis'])): data['wpredis'])):
try: try:
plugin_data_object = {"log_level": "INFO", plugin_data_object = {
"log_filesize": 5, "log_level": "INFO",
"enable_purge": 1, "log_filesize": 5,
"enable_map": "0", "enable_purge": 1,
"enable_log": 0, "enable_map": "0",
"enable_stamp": 1, "enable_log": 0,
"purge_homepage_on_new": 1, "enable_stamp": 1,
"purge_homepage_on_edit": 1, "purge_homepage_on_new": 1,
"purge_homepage_on_del": 1, "purge_homepage_on_edit": 1,
"purge_archive_on_new": 1, "purge_homepage_on_del": 1,
"purge_archive_on_edit": 0, "purge_archive_on_new": 1,
"purge_archive_on_del": 0, "purge_archive_on_edit": 0,
"purge_archive_on_new_comment": 0, "purge_archive_on_del": 0,
"purge_archive_on_deleted_comment": 0, "purge_archive_on_new_comment": 0,
"purge_page_on_mod": 1, "purge_archive_on_deleted_comment": 0,
"purge_page_on_new_comment": 1, "purge_page_on_mod": 1,
"purge_page_on_deleted_comment": 1, "purge_page_on_new_comment": 1,
"cache_method": "enable_redis", "purge_page_on_deleted_comment": 1,
"purge_method": "get_request", "cache_method": "enable_redis",
"redis_hostname": "127.0.0.1", "purge_method": "get_request",
"redis_hostname": "127.0.0.1",
"redis_port": "6379", "redis_port": "6379",
"redis_prefix": "nginx-cache:"} "redis_prefix": "nginx-cache:"}
plugin_data = json.dumps(plugin_data_object) plugin_data = json.dumps(plugin_data_object)
@@ -1653,26 +1655,27 @@ class WOSiteUpdateController(CementBaseController):
else: else:
try: try:
# disable nginx-helper # disable nginx-helper
plugin_data_object = {"log_level": "INFO", plugin_data_object = {
"log_filesize": 5, "log_level": "INFO",
"enable_purge": 0, "log_filesize": 5,
"enable_map": 0, "enable_purge": 0,
"enable_log": 0, "enable_map": 0,
"enable_stamp": 0, "enable_log": 0,
"purge_homepage_on_new": 1, "enable_stamp": 0,
"purge_homepage_on_edit": 1, "purge_homepage_on_new": 1,
"purge_homepage_on_del": 1, "purge_homepage_on_edit": 1,
"purge_archive_on_new": 1, "purge_homepage_on_del": 1,
"purge_archive_on_edit": 0, "purge_archive_on_new": 1,
"purge_archive_on_del": 0, "purge_archive_on_edit": 0,
"purge_archive_on_new_comment": 0, "purge_archive_on_del": 0,
"purge_archive_on_deleted_comment": 0, "purge_archive_on_new_comment": 0,
"purge_page_on_mod": 1, "purge_archive_on_deleted_comment": 0,
"purge_page_on_new_comment": 1, "purge_page_on_mod": 1,
"purge_page_on_deleted_comment": 1, "purge_page_on_new_comment": 1,
"cache_method": "enable_redis", "purge_page_on_deleted_comment": 1,
"purge_method": "get_request", "cache_method": "enable_redis",
"redis_hostname": "127.0.0.1", "purge_method": "get_request",
"redis_hostname": "127.0.0.1",
"redis_port": "6379", "redis_port": "6379",
"redis_prefix": "nginx-cache:"} "redis_prefix": "nginx-cache:"}
plugin_data = json.dumps(plugin_data_object) plugin_data = json.dumps(plugin_data_object)
@@ -1688,24 +1691,26 @@ class WOSiteUpdateController(CementBaseController):
"and please try again") "and please try again")
return 1 return 1
if ((oldcachetype in ['wpsc', 'basic', 'wpfc', 'wprocket', 'wpredis'] and if ((oldcachetype in ['wpsc', 'basic',
'wpfc', 'wprocket', 'wpredis'] and
(data['wpce'])) or (oldsitetype == 'wp' and (data['wpce'])) or (oldsitetype == 'wp' and
data['multisite'] and data['multisite'] and
data['wpce'])): data['wpce'])):
try: try:
installwp_plugin(self, 'cache-enabler', data) installwp_plugin(self, 'cache-enabler', data)
# setup cache-enabler # setup cache-enabler
plugin_data_object = {"expires": 24, plugin_data_object = {
"new_post": 1, "expires": 24,
"new_comment": 0, "new_post": 1,
"webp": 0, "new_comment": 0,
"clear_on_upgrade": 1, "webp": 0,
"compress": 0, "clear_on_upgrade": 1,
"excl_ids": "", "compress": 0,
"excl_regexp": "", "excl_ids": "",
"excl_cookies": "", "excl_regexp": "",
"incl_attributes": "", "excl_cookies": "",
"minify_html": 1} "incl_attributes": "",
"minify_html": 1}
plugin_data = json.dumps(plugin_data_object) plugin_data = json.dumps(plugin_data_object)
setupwp_plugin(self, 'cache-enabler', setupwp_plugin(self, 'cache-enabler',
'cache-enabler', plugin_data, data) 'cache-enabler', plugin_data, data)
@@ -1853,7 +1858,7 @@ class WOSiteDeleteController(CementBaseController):
Log.error(self, 'could not input site name') Log.error(self, 'could not input site name')
pargs.site_name = pargs.site_name.strip() pargs.site_name = pargs.site_name.strip()
(wo_domain, wo_www_domain) = ValidateDomain(pargs.site_name) (wo_domain, wo_www_domain) = DMN.validatedomain(self, pargs.site_name)
wo_db_name = '' wo_db_name = ''
wo_prompt = '' wo_prompt = ''
wo_nginx_prompt = '' wo_nginx_prompt = ''

View File

@@ -1,23 +1,22 @@
import getpass import getpass
import glob import glob
import json
import os import os
import random import random
import json
import re import re
import string import string
import subprocess import subprocess
import csv
from subprocess import CalledProcessError from subprocess import CalledProcessError
from wo.cli.plugins.sitedb import getSiteInfo from wo.cli.plugins.sitedb import getSiteInfo
from wo.cli.plugins.stack import WOStackController from wo.cli.plugins.stack import WOStackController
from wo.cli.plugins.stack_pref import post_pref
from wo.core.aptget import WOAptGet from wo.core.aptget import WOAptGet
from wo.core.fileutils import WOFileUtils from wo.core.fileutils import WOFileUtils
from wo.core.git import WOGit from wo.core.git import WOGit
from wo.core.logging import Log from wo.core.logging import Log
from wo.core.mysql import WOMysql from wo.core.mysql import WOMysql
from wo.core.services import WOService from wo.core.services import WOService
from wo.cli.plugins.stack_pref import post_pref
from wo.core.shellexec import CommandExecutionError, WOShellExec from wo.core.shellexec import CommandExecutionError, WOShellExec
from wo.core.sslutils import SSL from wo.core.sslutils import SSL
from wo.core.variables import WOVariables from wo.core.variables import WOVariables
@@ -864,7 +863,17 @@ def site_package_check(self, stype):
if stype in ['mysql', 'wp', 'wpsubdir', 'wpsubdomain']: if stype in ['mysql', 'wp', 'wpsubdir', 'wpsubdomain']:
Log.debug(self, "Setting apt_packages variable for MySQL") Log.debug(self, "Setting apt_packages variable for MySQL")
if not WOShellExec.cmd_exec(self, "/usr/bin/mysqladmin ping"): if not WOShellExec.cmd_exec(self, "/usr/bin/mysqladmin ping"):
apt_packages = apt_packages + WOVariables.wo_mysql if not WOVariables.wo_distro == 'raspbian':
if (not WOVariables.wo_platform_codename == 'jessie'):
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysqldb", "mariadb-backup"]
else:
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysql.connector"]
else:
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysqldb"]
apt_packages = apt_packages + wo_mysql
if stype in ['wp', 'wpsubdir', 'wpsubdomain']: if stype in ['wp', 'wpsubdir', 'wpsubdomain']:
Log.debug(self, "Setting packages variable for WP-CLI") Log.debug(self, "Setting packages variable for WP-CLI")
@@ -877,7 +886,7 @@ def site_package_check(self, stype):
if self.app.pargs.wpredis: if self.app.pargs.wpredis:
Log.debug(self, "Setting apt_packages variable for redis") Log.debug(self, "Setting apt_packages variable for redis")
if not WOAptGet.is_installed(self, 'redis-server'): if not WOAptGet.is_installed(self, 'redis-server'):
apt_packages = apt_packages + WOVariables.wo_redis apt_packages = apt_packages + ["redis-server"]
if self.app.pargs.php73: if self.app.pargs.php73:
Log.debug(self, "Setting apt_packages variable for PHP 7.3") Log.debug(self, "Setting apt_packages variable for PHP 7.3")
@@ -1290,37 +1299,6 @@ def removeAcmeConf(self, domain):
WOService.restart_service(self, "nginx") WOService.restart_service(self, "nginx")
def site_url_https(self, domain):
if os.path.isfile('/var/www/{0}/wp-config.php'.format(domain)):
wo_site_webroot = ('/var/www/{0}'.format(domain))
Log.info(self, "Checking if site url already "
"use https, please wait...")
WOFileUtils.chdir(self, '{0}/htdocs/'.format(wo_site_webroot))
wo_siteurl = \
WOShellExec.cmd_exec_stdout(self,
"{0} option get siteurl "
.format(WOVariables.wo_wpcli_path) +
"--allow-root --quiet")
test_url = re.split(":", wo_siteurl)
if not (test_url[0] == 'https'):
try:
WOShellExec.cmd_exec(self, "{0} option update siteurl "
"\'https://{1}\' --allow-root".format(
WOVariables.wo_wpcli_path, domain))
WOShellExec.cmd_exec(self, "{0} option update home "
"\'https://{1}\' --allow-root".format(
WOVariables.wo_wpcli_path, domain))
except CommandExecutionError as e:
Log.debug(self, "{0}".format(e))
raise SiteError("migration to https failed")
Log.info(
self, "Site address updated "
"successfully to https://{0}".format(domain))
else:
Log.info(
self, "Site address was already using https")
def doCleanupAction(self, domain='', webroot='', dbname='', dbuser='', def doCleanupAction(self, domain='', webroot='', dbname='', dbuser='',
dbhost=''): dbhost=''):
""" """
@@ -1350,7 +1328,7 @@ def doCleanupAction(self, domain='', webroot='', dbname='', dbuser='',
def setupLetsEncrypt(self, wo_domain_name, subdomain=False, wildcard=False, def setupLetsEncrypt(self, wo_domain_name, subdomain=False, wildcard=False,
wo_dns=False, wo_acme_dns='dns_cf', backend=False): wo_dns=False, wo_acme_dns='dns_cf'):
if os.path.isfile("/etc/letsencrypt/" if os.path.isfile("/etc/letsencrypt/"
"renewal/{0}_ecc/" "renewal/{0}_ecc/"
@@ -1371,11 +1349,12 @@ def setupLetsEncrypt(self, wo_domain_name, subdomain=False, wildcard=False,
self, "Validation : DNS mode with {0}".format(wo_acme_dns)) self, "Validation : DNS mode with {0}".format(wo_acme_dns))
else: else:
acme_mode = "-w /var/www/html" acme_mode = "-w /var/www/html"
validation_mode = "Subdomain Webroot challenge" validation_mode = "Webroot challenge"
Log.debug(self, "Validation : Webroot mode") Log.debug(self, "Validation : Webroot mode")
if subdomain: if subdomain:
Log.info(self, "Issuing subdomain SSL cert with acme.sh") Log.info(self, "Certificate type: Subdomain")
Log.info(self, "Validation mode : {0}".format(validation_mode)) Log.info(self, "Validation mode : {0}".format(validation_mode))
Log.wait(self, "Issuing SSL certificate with acme.sh")
ssl = WOShellExec.cmd_exec(self, "{0} ".format(wo_acme_exec) + ssl = WOShellExec.cmd_exec(self, "{0} ".format(wo_acme_exec) +
"--issue " "--issue "
"-d {0} {1} " "-d {0} {1} "
@@ -1384,8 +1363,9 @@ def setupLetsEncrypt(self, wo_domain_name, subdomain=False, wildcard=False,
acme_mode, acme_mode,
keylenght)) keylenght))
elif wildcard: elif wildcard:
Log.info(self, "Issuing Wildcard SSL cert with acme.sh") Log.info(self, "Certificate type: Wildcard")
Log.info(self, "Validation mode : {0}".format(validation_mode)) Log.info(self, "Validation mode : {0}".format(validation_mode))
Log.wait(self, "Issuing SSL certificate with acme.sh")
ssl = WOShellExec.cmd_exec(self, "{0} ".format(wo_acme_exec) + ssl = WOShellExec.cmd_exec(self, "{0} ".format(wo_acme_exec) +
"--issue " "--issue "
"-d {0} -d '*.{0}' --dns {1} " "-d {0} -d '*.{0}' --dns {1} "
@@ -1394,8 +1374,9 @@ def setupLetsEncrypt(self, wo_domain_name, subdomain=False, wildcard=False,
wo_acme_dns, wo_acme_dns,
keylenght)) keylenght))
else: else:
Log.info(self, "Issuing domain SSL cert with acme.sh") Log.info(self, "Certificate type: Domain + www")
Log.info(self, "Validation mode : {0}".format(validation_mode)) Log.info(self, "Validation mode : {0}".format(validation_mode))
Log.wait(self, "Issuing SSL certificate with acme.sh")
ssl = WOShellExec.cmd_exec(self, "{0} ".format(wo_acme_exec) + ssl = WOShellExec.cmd_exec(self, "{0} ".format(wo_acme_exec) +
"--issue " "--issue "
"-d {0} -d www.{0} {1} " "-d {0} -d www.{0} {1} "
@@ -1403,7 +1384,8 @@ def setupLetsEncrypt(self, wo_domain_name, subdomain=False, wildcard=False,
.format(wo_domain_name, .format(wo_domain_name,
acme_mode, keylenght)) acme_mode, keylenght))
if ssl: if ssl:
Log.info(self, "Deploying SSL cert with acme.sh") Log.valide(self, "Issuing SSL certificate with acme.sh")
Log.wait(self, "Deploying SSL cert with acme.sh")
Log.debug(self, "Cert deployment for domain: {0}" Log.debug(self, "Cert deployment for domain: {0}"
.format(wo_domain_name)) .format(wo_domain_name))
try: try:
@@ -1423,21 +1405,22 @@ def setupLetsEncrypt(self, wo_domain_name, subdomain=False, wildcard=False,
"service nginx restart\" " "service nginx restart\" "
.format(WOVariables.wo_ssl_live, .format(WOVariables.wo_ssl_live,
wo_domain_name)) wo_domain_name))
Log.info( Log.valide(self, "Deploying SSL cert with acme.sh")
self, "Adding /var/www/{0}/conf/nginx/ssl.conf" if os.path.isdir('/var/www/{0}/conf/nginx'
.format(wo_domain_name)) .format(wo_domain_name)):
sslconf = open("/var/www/{0}/conf/nginx/ssl.conf" sslconf = open("/var/www/{0}/conf/nginx/ssl.conf"
.format(wo_domain_name), .format(wo_domain_name),
encoding='utf-8', mode='w') encoding='utf-8', mode='w')
sslconf.write("listen 443 ssl http2;\n" sslconf.write(
"listen [::]:443 ssl http2;\n" "listen 443 ssl http2;\n"
"ssl_certificate {0}/{1}/fullchain.pem;\n" "listen [::]:443 ssl http2;\n"
"ssl_certificate_key {0}/{1}/key.pem;\n" "ssl_certificate {0}/{1}/fullchain.pem;\n"
"ssl_trusted_certificate {0}/{1}/ca.pem;\n" "ssl_certificate_key {0}/{1}/key.pem;\n"
"ssl_stapling_verify on;\n" "ssl_trusted_certificate {0}/{1}/ca.pem;\n"
.format(WOVariables.wo_ssl_live, wo_domain_name)) "ssl_stapling_verify on;\n"
sslconf.close() .format(WOVariables.wo_ssl_live, wo_domain_name))
sslconf.close()
# updateSiteInfo(self, wo_domain_name, ssl=True) # updateSiteInfo(self, wo_domain_name, ssl=True)
if not WOFileUtils.grep(self, '/var/www/22222/conf/nginx/ssl.conf', if not WOFileUtils.grep(self, '/var/www/22222/conf/nginx/ssl.conf',
'/etc/letsencrypt'): '/etc/letsencrypt'):
@@ -1466,34 +1449,6 @@ def setupLetsEncrypt(self, wo_domain_name, subdomain=False, wildcard=False,
"you are running Let\'s Encrypt Client " "you are running Let\'s Encrypt Client "
"\n to allow it to verify the site automatically.") "\n to allow it to verify the site automatically.")
# check if a wildcard exist to secure a new subdomain
def checkWildcardExist(self, wo_domain_name):
wo_acme_exec = ("/etc/letsencrypt/acme.sh --config-home "
"'/etc/letsencrypt/config'")
# export certificates list from acme.sh
WOShellExec.cmd_exec(self, "{0} ".format(wo_acme_exec) +
"--list --listraw > /var/lib/wo/cert.csv")
# define new csv dialect
csv.register_dialect('acmeconf', delimiter='|')
# open file
certfile = open('/var/lib/wo/cert.csv', mode='r', encoding='utf-8')
reader = csv.reader(certfile, 'acmeconf')
wo_wildcard_domain = ("*.{0}".format(wo_domain_name))
for row in reader:
if wo_wildcard_domain in row[2]:
isWildcard = True
break
else:
isWildcard = False
certfile.close()
return isWildcard
# copy wildcard certificate to a subdomain # copy wildcard certificate to a subdomain
@@ -1537,9 +1492,9 @@ def renewLetsEncrypt(self, wo_domain_name):
if not ssl: if not ssl:
Log.error(self, "ERROR : Let's Encrypt certificate renewal FAILED!", Log.error(self, "ERROR : Let's Encrypt certificate renewal FAILED!",
False) False)
if (SSL.getExpirationDays(self, wo_domain_name) > 0): if (SSL.getexpirationdays(self, wo_domain_name) > 0):
Log.error(self, "Your current certificate will expire within " + Log.error(self, "Your current certificate will expire within " +
str(SSL.getExpirationDays(self, wo_domain_name)) + str(SSL.getexpirationdays(self, wo_domain_name)) +
" days.", False) " days.", False)
else: else:
Log.error(self, "Your current certificate already expired!", False) Log.error(self, "Your current certificate already expired!", False)

View File

@@ -1,10 +1,11 @@
from sqlalchemy import Column, DateTime, String, Integer, Boolean from sqlalchemy import (Boolean, Column, DateTime, ForeignKey, Integer, String,
from sqlalchemy import ForeignKey, func func)
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from wo.core.logging import Log from sqlalchemy.orm import backref, relationship
from wo.core.database import db_session
from wo.cli.plugins.models import SiteDB from wo.cli.plugins.models import SiteDB
from wo.core.database import db_session
from wo.core.logging import Log
def addNewSite(self, site, stype, cache, path, def addNewSite(self, site, stype, cache, path,

View File

@@ -115,6 +115,7 @@ class WOStackController(CementBaseController):
empty_packages = [] empty_packages = []
wo_webroot = "/var/www/" wo_webroot = "/var/www/"
pargs = self.app.pargs pargs = self.app.pargs
try: try:
# Default action for stack installation # Default action for stack installation
if ((not pargs.web) and (not pargs.admin) and if ((not pargs.web) and (not pargs.admin) and
@@ -190,7 +191,7 @@ class WOStackController(CementBaseController):
if pargs.redis: if pargs.redis:
pargs.php = True pargs.php = True
if not WOAptGet.is_installed(self, 'redis-server'): if not WOAptGet.is_installed(self, 'redis-server'):
apt_packages = apt_packages + WOVariables.wo_redis apt_packages = apt_packages + ["redis-server"]
else: else:
Log.info(self, "Redis already installed") Log.info(self, "Redis already installed")
@@ -227,7 +228,17 @@ class WOStackController(CementBaseController):
pargs.mysqltuner = True 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 if not WOVariables.wo_distro == 'raspbian':
if (not WOVariables.wo_platform_codename == 'jessie'):
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysqldb", "mariadb-backup"]
else:
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysql.connector"]
else:
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysqldb"]
apt_packages = apt_packages + wo_mysql
else: else:
Log.debug(self, "MySQL already installed and alive") Log.debug(self, "MySQL already installed and alive")
Log.info(self, "MySQL already installed and alive") Log.info(self, "MySQL already installed and alive")
@@ -484,11 +495,15 @@ class WOStackController(CementBaseController):
# wo_mem = int(memsplit[0]) # wo_mem = int(memsplit[0])
# if (wo_mem < 4000000): # if (wo_mem < 4000000):
# WOSwap.add(self) # WOSwap.add(self)
Log.info(self, "Updating apt-cache, please wait...") Log.wait(self, "Updating apt-cache ")
WOAptGet.update(self) WOAptGet.update(self)
Log.info(self, "Installing packages, please wait...") Log.valide(self, "Updating apt-cache ")
Log.wait(self, "Installing APT packages ")
WOAptGet.install(self, apt_packages) WOAptGet.install(self, apt_packages)
Log.valide(self, "Installing APT packages ")
Log.wait(self, "Configuring APT packages ")
post_pref(self, apt_packages, empty_packages) post_pref(self, apt_packages, empty_packages)
Log.valide(self, "Configuring APT packages ")
if (packages): if (packages):
Log.debug(self, "Downloading following: {0}".format(packages)) Log.debug(self, "Downloading following: {0}".format(packages))
WODownload.download(self, packages) WODownload.download(self, packages)
@@ -533,7 +548,7 @@ 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/*'] packages = packages + ['/var/www/22222/htdocs']
if pargs.web: if pargs.web:
pargs.nginx = True pargs.nginx = True
@@ -581,12 +596,13 @@ class WOStackController(CementBaseController):
# REDIS # REDIS
if pargs.redis: if pargs.redis:
Log.debug(self, "Remove apt_packages variable of Redis") Log.debug(self, "Remove apt_packages variable of Redis")
apt_packages = apt_packages + WOVariables.wo_redis apt_packages = apt_packages + ["redis-server"]
# MariaDB # MariaDB
if pargs.mysql: if pargs.mysql:
Log.debug(self, "Removing apt_packages variable of MySQL") Log.debug(self, "Removing apt_packages variable of MySQL")
apt_packages = apt_packages + WOVariables.wo_mysql apt_packages = apt_packages + ['mariadb-server', 'mysql-common',
'mariadb-client']
# mysqlclient # mysqlclient
if pargs.mysqlclient: if pargs.mysqlclient:
@@ -691,7 +707,7 @@ class WOStackController(CementBaseController):
if (set(["nginx-custom"]).issubset(set(apt_packages))): if (set(["nginx-custom"]).issubset(set(apt_packages))):
WOService.stop_service(self, 'nginx') WOService.stop_service(self, 'nginx')
if (set(WOVariables.wo_mysql).issubset(set(apt_packages))): if (set(["mariadb-server"]).issubset(set(apt_packages))):
WOMysql.backupAll(self) WOMysql.backupAll(self)
WOService.stop_service(self, 'mysql') WOService.stop_service(self, 'mysql')
@@ -709,14 +725,15 @@ class WOStackController(CementBaseController):
errormsg='', log=False) errormsg='', log=False)
if (packages): if (packages):
Log.info(self, "Removing packages, please wait...") Log.wait(self, "Removing packages ")
WOFileUtils.remove(self, packages) WOFileUtils.remove(self, packages)
Log.valide(self, "Removing packages ")
if (apt_packages): if (apt_packages):
Log.debug(self, "Removing apt_packages") Log.debug(self, "Removing apt_packages")
Log.info(self, "Removing apt packages, please wait...") Log.wait(self, "Removing APT packages ")
WOAptGet.remove(self, apt_packages) WOAptGet.remove(self, apt_packages)
WOAptGet.auto_remove(self) WOAptGet.auto_remove(self)
Log.valide(self, "Removing APT packages ")
Log.info(self, "Successfully removed packages") Log.info(self, "Successfully removed packages")
@@ -751,7 +768,7 @@ 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/*'] packages = packages + ['/var/www/22222/htdocs']
if pargs.web: if pargs.web:
pargs.nginx = True pargs.nginx = True
@@ -799,12 +816,13 @@ class WOStackController(CementBaseController):
# REDIS # REDIS
if pargs.redis: if pargs.redis:
Log.debug(self, "Remove apt_packages variable of Redis") Log.debug(self, "Remove apt_packages variable of Redis")
apt_packages = apt_packages + WOVariables.wo_redis apt_packages = apt_packages + ["redis-server"]
# MariaDB # MariaDB
if pargs.mysql: if pargs.mysql:
Log.debug(self, "Removing apt_packages variable of MySQL") Log.debug(self, "Removing apt_packages variable of MySQL")
apt_packages = apt_packages + WOVariables.wo_mysql apt_packages = apt_packages + ['mariadb-server', 'mysql-common',
'mariadb-client']
# mysqlclient # mysqlclient
if pargs.mysqlclient: if pargs.mysqlclient:
@@ -916,7 +934,7 @@ class WOStackController(CementBaseController):
if (set(["fail2ban"]).issubset(set(apt_packages))): if (set(["fail2ban"]).issubset(set(apt_packages))):
WOService.stop_service(self, 'fail2ban') WOService.stop_service(self, 'fail2ban')
if (set(WOVariables.wo_mysql).issubset(set(apt_packages))): if (set(["mariadb-server"]).issubset(set(apt_packages))):
WOMysql.backupAll(self) WOMysql.backupAll(self)
WOService.stop_service(self, 'mysql') WOService.stop_service(self, 'mysql')
@@ -934,15 +952,15 @@ class WOStackController(CementBaseController):
"uninstaller.sh -y -f") "uninstaller.sh -y -f")
if (apt_packages): if (apt_packages):
Log.info(self, "Purging apt packages, please wait...") Log.wait(self, "Purging APT Packages ")
WOAptGet.remove(self, apt_packages, purge=True) WOAptGet.remove(self, apt_packages, purge=True)
WOAptGet.auto_remove(self) WOAptGet.auto_remove(self)
Log.valide(self, "Purging APT Packages ")
if (packages): if (packages):
Log.info(self, "Purging packages, please wait...") Log.wait(self, "Purging Packages ")
WOFileUtils.remove(self, packages) WOFileUtils.remove(self, packages)
WOAptGet.auto_remove(self) Log.valide(self, "Purging Packages ")
Log.info(self, "Successfully purged packages") Log.info(self, "Successfully purged packages")

View File

@@ -78,7 +78,7 @@ class WOStackMigrateController(CementBaseController):
log=False) log=False)
# Install MariaDB # Install MariaDB
apt_packages = WOVariables.wo_mysql apt_packages = ["mariadb-server"]
Log.info(self, "Updating apt-cache, hang on...") Log.info(self, "Updating apt-cache, hang on...")
WOAptGet.update(self) WOAptGet.update(self)

View File

@@ -14,7 +14,6 @@ from wo.core.apt_repo import WORepo
from wo.core.aptget import WOAptGet from wo.core.aptget import WOAptGet
from wo.core.checkfqdn import check_fqdn_ip from wo.core.checkfqdn import check_fqdn_ip
from wo.core.cron import WOCron from wo.core.cron import WOCron
from wo.core.domainvalidate import GetDomainlevel
from wo.core.extract import WOExtract from wo.core.extract import WOExtract
from wo.core.fileutils import WOFileUtils from wo.core.fileutils import WOFileUtils
from wo.core.git import WOGit from wo.core.git import WOGit
@@ -29,8 +28,9 @@ from wo.core.variables import WOVariables
def pre_pref(self, apt_packages): def pre_pref(self, apt_packages):
"""Pre settings to do before installation packages""" """Pre settings to do before installation packages"""
if (set(WOVariables.wo_mysql).issubset(set(apt_packages)) or if (set(["mariadb-server"]).issubset(set(apt_packages)) or
set(WOVariables.wo_mysql_client).issubset(set(apt_packages))): set(["mariadb-client"]).issubset(set(apt_packages)) or
set(["mariadb-backup"]).issubset((set(apt_packages)))):
# add mariadb repository excepted on raspbian and ubuntu 19.04 # add mariadb repository excepted on raspbian and ubuntu 19.04
if (not WOVariables.wo_distro == 'raspbian'): if (not WOVariables.wo_distro == 'raspbian'):
Log.info(self, "Adding repository for MySQL, please wait...") Log.info(self, "Adding repository for MySQL, please wait...")
@@ -47,7 +47,7 @@ def pre_pref(self, apt_packages):
keyserver="keyserver.ubuntu.com") keyserver="keyserver.ubuntu.com")
WORepo.add_key(self, '0xF1656F24C74CD1D8', WORepo.add_key(self, '0xF1656F24C74CD1D8',
keyserver="keyserver.ubuntu.com") keyserver="keyserver.ubuntu.com")
if set(WOVariables.wo_mysql).issubset(set(apt_packages)): if set(["mariadb-server"]).issubset(set(apt_packages)):
# generate random 24 characters root password # generate random 24 characters root password
chars = ''.join(random.sample(string.ascii_letters, 24)) chars = ''.join(random.sample(string.ascii_letters, 24))
@@ -139,7 +139,7 @@ def pre_pref(self, apt_packages):
Log.debug(self, 'Adding deb.sury GPG key') Log.debug(self, 'Adding deb.sury GPG key')
WORepo.add_key(self, WOVariables.wo_php_key) WORepo.add_key(self, WOVariables.wo_php_key)
# add redis repository # add redis repository
if set(WOVariables.wo_redis).issubset(set(apt_packages)): if set(['redis-server']).issubset(set(apt_packages)):
Log.info(self, "Adding repository for Redis, please wait...") Log.info(self, "Adding repository for Redis, please wait...")
if WOVariables.wo_distro == 'ubuntu': if WOVariables.wo_distro == 'ubuntu':
Log.debug(self, 'Adding ppa for redis') Log.debug(self, 'Adding ppa for redis')
@@ -189,7 +189,7 @@ def post_pref(self, apt_packages, packages, upgrade=False):
'\t$request_filename;\n') '\t$request_filename;\n')
try: try:
data = dict(php="9000", debug="9001", data = dict(php="9000", debug="9001",
php7="9070", debug7="9170") php7="9070", debug7="9170")
WOTemplate.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)
@@ -876,7 +876,7 @@ def post_pref(self, apt_packages, packages, upgrade=False):
WOService.restart_service(self, 'php7.3-fpm') WOService.restart_service(self, 'php7.3-fpm')
# create mysql config if it doesn't exist # create mysql config if it doesn't exist
if set(WOVariables.wo_mysql).issubset(set(apt_packages)): if set(["mariadb-server"]).issubset(set(apt_packages)):
if not os.path.isfile("/etc/mysql/my.cnf"): if not os.path.isfile("/etc/mysql/my.cnf"):
config = ("[mysqld]\nwait_timeout = 30\n" config = ("[mysqld]\nwait_timeout = 30\n"
"interactive_timeout=60\nperformance_schema = 0" "interactive_timeout=60\nperformance_schema = 0"
@@ -885,101 +885,36 @@ def post_pref(self, apt_packages, packages, upgrade=False):
encoding='utf-8', mode='w') encoding='utf-8', mode='w')
config_file.write(config) config_file.write(config)
config_file.close() config_file.close()
elif (not WOFileUtils.grep(self, "/etc/mysql/my.cnf", "WordOps")): else:
Log.info(self, "Tuning MariaDB configuration") Log.info(self, "Tuning MariaDB configuration")
with open("/etc/mysql/my.cnf", if not os.path.isfile("/etc/mysql/my.cnf.default-pkg"):
"a") as mysql_file: WOFileUtils.copyfile(self, "/etc/mysql/my.cnf",
mysql_file.write("\n# WordOps v3.9.8\n") "/etc/mysql/my.cnf.default-pkg")
wo_ram = psutil.virtual_memory().total / (1024 * 1024) wo_ram = psutil.virtual_memory().total / (1024 * 1024)
# set InnoDB variable depending on the RAM available # 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)
if (wo_ram < 2000):
wo_innodb_instance = int(1)
tmp_table_size = int(32)
elif (wo_ram > 2000) and (wo_ram < 64000):
wo_innodb_instance = int(wo_ram/1000)
tmp_table_size = int(128)
elif (wo_ram > 64000):
wo_innodb_instance = int(64)
tmp_table_size = int(256)
data = dict(
tmp_table_size=tmp_table_size, inno_log=wo_ram_log_size,
inno_buffer=wo_ram_innodb,
inno_log_buffer=wo_ram_log_buffer,
innodb_instances=wo_innodb_instance)
WOTemplate.render(
self, '/etc/mysql/my.cnf', 'my.mustache', data)
# replacing default values # replacing default values
Log.debug(self, "Tuning MySQL configuration") Log.debug(self, "Tuning MySQL configuration")
# set innodb_buffer_pool_instances depending # set innodb_buffer_pool_instances depending
# on the amount of RAM # 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",
"innodb_buffer_pool_size = 256M",
"innodb_buffer_pool_size "
"= {0}M\n"
"innodb_buffer_pool_instances "
"= {1}\n"
.format(wo_ram_innodb,
wo_innodb_instance))
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"innodb_log_buffer_size = 8M",
"innodb_log_buffer_size = {0}M"
.format(wo_ram_log_buffer))
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"#innodb_log_file_size = 50M",
"innodb_log_file_size = {0}M"
.format(wo_ram_log_size))
WOFileUtils.searchreplace(self,
"/etc/mysql/my.cnf",
"wait_timeout "
"= 600",
"wait_timeout "
"= 120\n"
"skip-name-resolve = 1\n")
# disabling mariadb binlog
WOFileUtils.searchreplace(self,
"/etc/mysql/my.cnf",
"log_bin "
"= /var/log/mysql/"
"mariadb-bin",
"#log_bin "
" = /var/log/"
"mysql/mariadb-bin")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
'log_bin_index '
"= /var/log/mysql/"
"mariadb-bin.index",
"#log_bin_index "
"= /var/log/mysql/"
"mariadb-bin.index")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"expire_logs_days = 10",
"#expire_logs_days "
"= 10")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"max_binlog_size "
"= 100M",
"#max_binlog_size "
"= 100M")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"innodb_open_files ="
" 400",
"innodb_open_files ="
" 16000")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"innodb_io_capacity ="
" 400",
"innodb_io_capacity ="
" 16000")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"query_cache_size = 64M",
"query_cache_size = 0")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"#query_cache_type = DEMAND",
"query_cache_type = 0")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"#open-files-limit = 2000",
"open-files-limit = 10000")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"table_open_cache = 400",
"table_open_cache = 16000")
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
"max_allowed_packet = 16M",
"max_allowed_packet = 64M\n")
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',
'/var/lib/mysql/ib_logfile0.bak') '/var/lib/mysql/ib_logfile0.bak')
@@ -1106,7 +1041,7 @@ def post_pref(self, apt_packages, packages, upgrade=False):
WOService.reload_service(self, 'proftpd') WOService.reload_service(self, 'proftpd')
# Redis configuration # Redis configuration
if set(WOVariables.wo_redis).issubset(set(apt_packages)): if set(['redus-server']).issubset(set(apt_packages)):
if os.path.isfile("/etc/nginx/conf.d/upstream.conf"): if os.path.isfile("/etc/nginx/conf.d/upstream.conf"):
if not WOFileUtils.grep(self, "/etc/nginx/conf.d/" if not WOFileUtils.grep(self, "/etc/nginx/conf.d/"
"upstream.conf", "upstream.conf",

View File

@@ -2,6 +2,7 @@ import os
from cement.core import handler, hook from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose from cement.core.controller import CementBaseController, expose
from wo.core.aptget import WOAptGet from wo.core.aptget import WOAptGet
from wo.core.logging import Log from wo.core.logging import Log
from wo.core.services import WOService from wo.core.services import WOService

View File

@@ -3,6 +3,7 @@ import shutil
from cement.core import handler, hook from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose from cement.core.controller import CementBaseController, expose
from wo.cli.plugins.stack_pref import post_pref, pre_pref from wo.cli.plugins.stack_pref import post_pref, pre_pref
from wo.core.aptget import WOAptGet from wo.core.aptget import WOAptGet
from wo.core.download import WODownload from wo.core.download import WODownload
@@ -87,8 +88,6 @@ class WOStackUpgradeController(CementBaseController):
if pargs.web: if pargs.web:
if WOAptGet.is_installed(self, 'nginx-custom'): if WOAptGet.is_installed(self, 'nginx-custom'):
pargs.nginx = True pargs.nginx = True
else:
Log.info(self, "Nginx is not already installed")
pargs.php = True pargs.php = True
pargs.mysql = True pargs.mysql = True
pargs.wpcli = True pargs.wpcli = True
@@ -121,13 +120,13 @@ class WOStackUpgradeController(CementBaseController):
if pargs.mysql: if pargs.mysql:
if WOAptGet.is_installed(self, 'mariadb-server'): if WOAptGet.is_installed(self, 'mariadb-server'):
apt_packages = apt_packages + WOVariables.wo_mysql apt_packages = apt_packages + ['mariadb-server']
else: else:
Log.info(self, "MariaDB is not installed") Log.info(self, "MariaDB is not installed")
if pargs.redis: if pargs.redis:
if WOAptGet.is_installed(self, 'redis-server'): if WOAptGet.is_installed(self, 'redis-server'):
apt_packages = apt_packages + WOVariables.wo_redis apt_packages = apt_packages + ['redis-server']
else: else:
Log.info(self, "Redis is not installed") Log.info(self, "Redis is not installed")
@@ -204,8 +203,12 @@ class WOStackUpgradeController(CementBaseController):
'/etc/apt/preferences.d/nginx-block'): '/etc/apt/preferences.d/nginx-block'):
WOAptGet.install(self, nginx_packages) WOAptGet.install(self, nginx_packages)
Log.wait(self, "Upgrading APT Packages ")
WOAptGet.install(self, apt_packages) WOAptGet.install(self, apt_packages)
Log.valide(self, "Upgrading APT Packages ")
Log.wait(self, "Configuring APT Packages ")
post_pref(self, nginx_packages, [], True) post_pref(self, nginx_packages, [], True)
Log.valide(self, "Configuring APT Packages ")
post_pref(self, apt_packages, [], True) post_pref(self, apt_packages, [], True)
# Post Actions after package updates # Post Actions after package updates
@@ -226,7 +229,7 @@ class WOStackUpgradeController(CementBaseController):
WOFileUtils.chmod(self, "/usr/local/bin/wp", 0o775) WOFileUtils.chmod(self, "/usr/local/bin/wp", 0o775)
if pargs.netdata: if pargs.netdata:
Log.info(self, "Upgrading Netdata, please wait...") Log.wait(self, "Upgrading Netdata ")
if os.path.isdir('/opt/netdata'): if os.path.isdir('/opt/netdata'):
WOShellExec.cmd_exec( WOShellExec.cmd_exec(
self, "bash /opt/netdata/usr/" self, "bash /opt/netdata/usr/"
@@ -237,6 +240,7 @@ class WOStackUpgradeController(CementBaseController):
self, "bash /usr/" self, "bash /usr/"
"libexec/netdata/netdata-" "libexec/netdata/netdata-"
"updater.sh") "updater.sh")
Log.valide(self, "Upgrading Netdata ")
if pargs.dashboard: if pargs.dashboard:
Log.debug(self, "Extracting wo-dashboard.tar.gz " Log.debug(self, "Extracting wo-dashboard.tar.gz "
@@ -252,16 +256,17 @@ class WOStackUpgradeController(CementBaseController):
WOVariables.wo_php_user, recursive=True) WOVariables.wo_php_user, recursive=True)
if pargs.composer: if pargs.composer:
Log.info(self, "Upgrading Composer, please wait...") Log.wait(self, "Upgrading Composer ")
WOShellExec.cmd_exec(self, "php -q /var/lib/wo" WOShellExec.cmd_exec(self, "php -q /var/lib/wo"
"/tmp/composer-install " "/tmp/composer-install "
"--install-dir=/var/lib/wo/tmp/") "--install-dir=/var/lib/wo/tmp/")
shutil.copyfile('/var/lib/wo/tmp/composer.phar', shutil.copyfile('/var/lib/wo/tmp/composer.phar',
'/usr/local/bin/composer') '/usr/local/bin/composer')
WOFileUtils.chmod(self, "/usr/local/bin/composer", 0o775) WOFileUtils.chmod(self, "/usr/local/bin/composer", 0o775)
Log.valide(self, "Upgrading Composer ")
if pargs.phpmyadmin: if pargs.phpmyadmin:
Log.info(self, "Upgrading phpMyAdmin, please wait...") Log.wait(self, "Upgrading phpMyAdmin ")
WOExtract.extract(self, '/var/lib/wo/tmp/pma.tar.gz', WOExtract.extract(self, '/var/lib/wo/tmp/pma.tar.gz',
'/var/lib/wo/tmp/') '/var/lib/wo/tmp/')
shutil.copyfile(('{0}22222/htdocs/db/pma' shutil.copyfile(('{0}22222/htdocs/db/pma'
@@ -282,6 +287,7 @@ class WOStackUpgradeController(CementBaseController):
.format(WOVariables.wo_webroot), .format(WOVariables.wo_webroot),
WOVariables.wo_php_user, WOVariables.wo_php_user,
WOVariables.wo_php_user, recursive=True) WOVariables.wo_php_user, recursive=True)
Log.valide(self, "Upgrading phpMyAdmin ")
Log.info(self, "Successfully updated packages") Log.info(self, "Successfully updated packages")
else: else:

View File

@@ -2,6 +2,7 @@ import glob
from cement.core import handler, hook from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose from cement.core.controller import CementBaseController, expose
from wo.cli.plugins.sitedb import getAllsites, updateSiteInfo from wo.cli.plugins.sitedb import getAllsites, updateSiteInfo
from wo.core.fileutils import WOFileUtils from wo.core.fileutils import WOFileUtils
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -3,6 +3,7 @@ import time
from cement.core import handler, hook from cement.core import handler, hook
from cement.core.controller import CementBaseController, expose from cement.core.controller import CementBaseController, expose
from wo.core.download import WODownload from wo.core.download import WODownload
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -0,0 +1,195 @@
# MariaDB database server configuration file.
#
# You can copy this file to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
skip-external-locking
skip-name-resolve = 1
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = ::ffff:127.0.0.1
#
# * Fine Tuning
#
max_connections = 100
connect_timeout = 5
wait_timeout = 60
max_allowed_packet = 64M
thread_cache_size = 128
sort_buffer_size = 4M
bulk_insert_buffer_size = 16M
tmp_table_size = {{tmp_table_size}}M
max_heap_table_size = {{tmp_table_size}}M
#
# * MyISAM
#
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched. On error, make copy and try a repair.
myisam_recover_options = BACKUP
key_buffer_size = 128M
open-files-limit = 500000
table_open_cache = 16000
myisam_sort_buffer_size = 512M
concurrent_insert = 2
read_buffer_size = 2M
read_rnd_buffer_size = 1M
#
# * Query Cache Configuration
#
# Cache only tiny result sets, so we can fit more in the query cache.
query_cache_limit = 128K
query_cache_size = 0
# for more write intensive setups, set to DEMAND or OFF
query_cache_type = 0
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# we do want to know about network errors and such
log_warnings = 2
#
# Enable the slow query log to see queries with especially long duration
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 10
#log_slow_rate_limit = 1000
log_slow_verbosity = query_plan
#log-queries-not-using-indexes
#log_slow_admin_statements
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
#server-id = 1
#report_host = master1
#auto_increment_increment = 2
#auto_increment_offset = 1
#log_bin = /var/log/mysql/mariadb-bin
#log_bin_index = /var/log/mysql/mariadb-bin.index
# not fab for performance, but safer
#sync_binlog = 1
#expire_logs_days = 10
#max_binlog_size = 100M
transaction_isolation = READ-COMMITTED
binlog_format = ROW
# slaves
#relay_log = /var/log/mysql/relay-bin
#relay_log_index = /var/log/mysql/relay-bin.index
#relay_log_info_file = /var/log/mysql/relay-bin.info
#log_slave_updates
#read_only
#
# If applications support it, this stricter sql_mode prevents some
# mistakes like inserting invalid dates etc.
#sql_mode = NO_ENGINE_SUBSTITUTION,TRADITIONAL
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
default_storage_engine = InnoDB
# you can't just change log file size, requires special procedure
innodb_log_file_size = {{inno_log}}M
innodb_buffer_pool_size = {{inno_buffer}}M
innodb_log_buffer_size = {{inno_log_buffer}}M
innodb_file_per_table = 1
innodb_open_files = 500000
innodb_io_capacity = 500000
innodb_flush_method = O_DIRECT
innodb_buffer_pool_instances = {{innodb_instances}}
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0
[mysqldump]
quick
quote-names
max_allowed_packet = 64M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completion
[isamchk]
key_buffer = 16M
#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
#
!include /etc/mysql/mariadb.cnf
!includedir /etc/mysql/conf.d/

View File

@@ -1,11 +1,13 @@
"""WordOps Swap Creation""" """WordOps Swap Creation"""
from wo.core.shellexec import WOShellExec
from wo.core.fileutils import WOFileUtils
from wo.core.aptget import WOAptGet
from wo.core.logging import Log
import os import os
import psutil import psutil
from wo.core.aptget import WOAptGet
from wo.core.fileutils import WOFileUtils
from wo.core.logging import Log
from wo.core.shellexec import WOShellExec
class WOSwap(): class WOSwap():
"""Manage Swap""" """Manage Swap"""

View File

@@ -1,8 +1,9 @@
"""WordOps packages repository operations""" """WordOps packages repository operations"""
import os
from wo.core.logging import Log
from wo.core.shellexec import WOShellExec from wo.core.shellexec import WOShellExec
from wo.core.variables import WOVariables from wo.core.variables import WOVariables
from wo.core.logging import Log
import os
class WORepo(): class WORepo():

View File

@@ -1,11 +1,12 @@
"""WordOps package installation using apt-get module.""" """WordOps package installation using apt-get module."""
import apt
import sys
import subprocess import subprocess
from wo.core.logging import Log import sys
from sh import ErrorReturnCode, apt_get
import apt
from wo.core.apt_repo import WORepo from wo.core.apt_repo import WORepo
from sh import apt_get from wo.core.logging import Log
from sh import ErrorReturnCode
class WOAptGet(): class WOAptGet():

View File

@@ -1,6 +1,7 @@
import requests
from wo.core.shellexec import WOShellExec from wo.core.shellexec import WOShellExec
from wo.core.variables import WOVariables from wo.core.variables import WOVariables
import requests
def check_fqdn(self, wo_host): def check_fqdn(self, wo_host):

View File

@@ -1,5 +1,6 @@
from wo.core.shellexec import WOShellExec
from wo.core.logging import Log from wo.core.logging import Log
from wo.core.shellexec import WOShellExec
""" """
Set CRON on LINUX system. Set CRON on LINUX system.

View File

@@ -1,54 +1,52 @@
"""WordOps domain validation module.""" """WordOps domain validation module."""
from urllib.parse import urlparse
import os import os
from urllib.parse import urlparse
def ValidateDomain(url): class DMN():
"""
This function returns domain name removing http:// and https://
returns domain name only with or without www as user provided.
"""
# Check if http:// or https:// present remove it if present def validatedomain(self, url):
domain_name = url.split('/') """
if 'http:' in domain_name or 'https:' in domain_name: This function returns domain name removing http:// and https://
domain_name = domain_name[2] returns domain name only with or without www as user provided.
else: """
domain_name = domain_name[0]
www_domain_name = domain_name.split('.')
final_domain = ''
if www_domain_name[0] == 'www':
final_domain = '.'.join(www_domain_name[1:])
else:
final_domain = domain_name
return (final_domain, domain_name) # Check if http:// or https:// present remove it if present
domain_name = url.split('/')
if 'http:' in domain_name or 'https:' in domain_name:
domain_name = domain_name[2]
else:
domain_name = domain_name[0]
www_domain_name = domain_name.split('.')
final_domain = ''
if www_domain_name[0] == 'www':
final_domain = '.'.join(www_domain_name[1:])
else:
final_domain = domain_name
return (final_domain, domain_name)
def GetDomainlevel(domain): def getdomainlevel(self, domain):
""" """
This function returns the domain type : domain, subdomain, This function returns the domain type : domain, subdomain,
""" """
domain_name = domain.lower().split('.') domain_name = domain.lower().strip().split('.')
if domain_name[0] == 'www': if domain_name[0] == 'www':
domain_name = domain_name[1:] domain_name = domain_name[1:]
domain_type = '' domain_type = ''
if os.path.isfile("/var/lib/wo/public_suffix_list.dat"): if os.path.isfile("/var/lib/wo/public_suffix_list.dat"):
# Read mode opens a file for reading only. # Read mode opens a file for reading only.
Suffix_file = open( suffix_file = open(
"/var/lib/wo/public_suffix_list.dat", encoding='utf-8', ) "/var/lib/wo/public_suffix_list.dat", encoding='utf-8', )
# Read all the lines into a list. # Read all the lines into a list.
for domain_suffix in Suffix_file: for domain_suffix in suffix_file:
if (str(domain_suffix).strip()) == ('.'.join(domain_name[1:])): if (str(domain_suffix).strip()) == ('.'.join(domain_name[1:])):
domain_type = 'domain' domain_type = 'domain'
root_domain = ('.'.join(domain_name[0:])) root_domain = ('.'.join(domain_name[0:]))
break break
elif (str(domain_suffix).strip()) == ('.'.join(domain_name[2:])): else:
domain_type = 'subdomain' domain_type = 'subdomain'
root_domain = ('.'.join(domain_name[1:])) root_domain = ('.'.join(domain_name[1:]))
break suffix_file.close()
else:
domain_type = 'other'
Suffix_file.close()
return (domain_type, root_domain) return (domain_type, root_domain)

View File

@@ -1,7 +1,8 @@
"""WordOps download core classes.""" """WordOps download core classes."""
import urllib.request
import urllib.error
import os import os
import urllib.error
import urllib.request
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -1,6 +1,7 @@
"""WordOps Extract Core """ """WordOps Extract Core """
import tarfile
import os import os
import tarfile
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -1,8 +1,9 @@
"""WordOps file utils core classes.""" """WordOps file utils core classes."""
import shutil import fileinput
import os import os
import pwd import pwd
import fileinput import shutil
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -1,8 +1,10 @@
"""WordOps GIT module""" """WordOps GIT module"""
from sh import git, ErrorReturnCode
from wo.core.logging import Log
import os import os
from sh import ErrorReturnCode, git
from wo.core.logging import Log
class WOGit: class WOGit:
"""Intialization of core variables""" """Intialization of core variables"""

View File

@@ -45,3 +45,35 @@ class Log:
Logs debug messages into log file Logs debug messages into log file
""" """
self.app.log.debug(Log.HEADER + msg + Log.ENDC) self.app.log.debug(Log.HEADER + msg + Log.ENDC)
def wait(self, msg, end='\r', log=True):
"""
Logs info messages with validation step
"""
print(
Log.OKBLUE + msg +
" [" + Log.ENDC + ".." + Log.OKBLUE + "]" + Log.ENDC, end=end)
if log:
self.app.log.info(Log.OKBLUE + msg + Log.ENDC)
def valide(self, msg, end='\n', log=True):
"""
Logs info messages after validation step
"""
print(
Log.OKBLUE + msg +
" [" + Log.ENDC + Log.OKGREEN + "OK" +
Log.ENDC + Log.OKBLUE + "]" + Log.ENDC, end=end)
if log:
self.app.log.info(Log.OKGREEN + msg + Log.ENDC)
def failed(self, msg, end='\n', log=True):
"""
Logs info messages after validation step
"""
print(
Log.OKBLUE + msg +
" [" + Log.ENDC + Log.FAIL + "OK" +
Log.ENDC + Log.OKBLUE + "]" + Log.ENDC, end=end)
if log:
self.app.log.info(Log.FAIL + msg + Log.ENDC)

View File

@@ -3,10 +3,11 @@
Real time log files watcher supporting log rotation. Real time log files watcher supporting log rotation.
""" """
import os
import time
import errno import errno
import os
import stat import stat
import time
from wo.core.logging import Log from wo.core.logging import Log

View File

@@ -1,8 +1,10 @@
"""WordOps MySQL core classes.""" """WordOps MySQL core classes."""
import pymysql
from pymysql import connections, DatabaseError, Error
from os.path import expanduser
import os import os
from os.path import expanduser
import pymysql
from pymysql import DatabaseError, Error, connections
from wo.core.logging import Log from wo.core.logging import Log
from wo.core.variables import WOVariables from wo.core.variables import WOVariables

View File

@@ -1,10 +1,11 @@
"""WordOps Hash Bucket Calculator""" """WordOps Hash Bucket Calculator"""
from wo.core.fileutils import WOFileUtils import fileinput
import math import math
import os import os
import fileinput
import subprocess import subprocess
from wo.core.fileutils import WOFileUtils
def hashbucket(self): def hashbucket(self):
# Check Nginx Hashbucket error # Check Nginx Hashbucket error

View File

@@ -1,10 +1,10 @@
import smtplib
import os import os
from email.mime.multipart import MIMEMultipart import smtplib
from email import encoders
from email.mime.base import MIMEBase from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate from email.utils import COMMASPACE, formatdate
from email import encoders
def WOSendMail(send_from, send_to, subject, text, files, server="localhost", def WOSendMail(send_from, send_to, subject, text, files, server="localhost",

View File

@@ -1,5 +1,6 @@
"""WordOps Service Manager""" """WordOps Service Manager"""
import subprocess import subprocess
from wo.core.logging import Log from wo.core.logging import Log
@@ -15,21 +16,21 @@ class WOService():
""" """
try: try:
if service_name in ['nginx']: if service_name in ['nginx']:
Log.wait(self, "Testing Nginx configuration ")
# Check Nginx configuration before executing command # Check Nginx configuration before executing command
sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE, sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True) stderr=subprocess.PIPE, shell=True)
output, error_output = sub.communicate() output, error_output = sub.communicate()
if 'emerg' not in str(error_output): if 'emerg' not in str(error_output):
Log.valide(self, "Testing Nginx configuration ")
Log.wait(self, "Starting Nginx ")
service_cmd = ('service {0} start'.format(service_name)) service_cmd = ('service {0} start'.format(service_name))
retcode = subprocess.getstatusoutput(service_cmd) retcode = subprocess.getstatusoutput(service_cmd)
if retcode[0] == 0: if retcode[0] == 0:
Log.info(self, "Starting Nginx " + Log.valide(self, "Starting Nginx ")
"[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
return True return True
else: else:
Log.info( Log.failed(self, "Testing Nginx configuration ")
self, "Starting Nginx " + "[" + Log.FAIL +
"Failed" + Log.OKBLUE+"]")
return False return False
else: else:
service_cmd = ('service {0} start'.format(service_name)) service_cmd = ('service {0} start'.format(service_name))
@@ -76,32 +77,35 @@ class WOService():
""" """
try: try:
if service_name in ['nginx']: if service_name in ['nginx']:
Log.wait(self, "Testing Nginx configuration ")
# Check Nginx configuration before executing command # Check Nginx configuration before executing command
sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE, sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True) stderr=subprocess.PIPE, shell=True)
output, error_output = sub.communicate() output, error_output = sub.communicate()
if 'emerg' not in str(error_output): if 'emerg' not in str(error_output):
Log.valide(self, "Testing Nginx configuration ")
Log.wait(self, "Restarting Nginx ")
service_cmd = ('service {0} restart'.format(service_name)) service_cmd = ('service {0} restart'.format(service_name))
retcode = subprocess.getstatusoutput(service_cmd) retcode = subprocess.getstatusoutput(service_cmd)
if retcode[0] == 0: if retcode[0] == 0:
Log.info(self, "Restarting Nginx " + Log.valide(self, "Restarting Nginx ")
"[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
return True return True
else: else:
Log.info(self, "Restarting Nginx " + "[" + Log.FAIL + Log.failed(self, "Testing Nginx configuration ")
"Failed" + Log.OKBLUE+"]")
return False 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.wait(self, "Restarting {0:10}".format(
service_name), end='') service_name))
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.valide(self, "Restarting {0:10}".format(
service_name))
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.failed(self, "Restarting {0:10}".format(
service_name))
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))
@@ -116,31 +120,33 @@ class WOService():
try: try:
if service_name in ['nginx']: if service_name in ['nginx']:
# Check Nginx configuration before executing command # Check Nginx configuration before executing command
Log.wait(self, "Testing Nginx configuration ")
sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE, sub = subprocess.Popen('nginx -t', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True) stderr=subprocess.PIPE, shell=True)
output, error_output = sub.communicate() output, error_output = sub.communicate()
if 'emerg' not in str(error_output): if 'emerg' not in str(error_output):
Log.valide(self, "Testing Nginx configuration ")
Log.wait(self, "Reloading Nginx ")
service_cmd = ('service {0} reload'.format(service_name)) service_cmd = ('service {0} reload'.format(service_name))
retcode = subprocess.getstatusoutput(service_cmd) retcode = subprocess.getstatusoutput(service_cmd)
if retcode[0] == 0: if retcode[0] == 0:
Log.info(self, "Reloading Nginx " + Log.valide(self, "Reloading Nginx ")
"[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
return True return True
else: else:
Log.info( Log.failed(self, "Testing Nginx configuration ")
self, "Reloading Nginx " + "[" + Log.FAIL +
"Failed" + Log.OKBLUE+"]")
return False 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.wait(self, "Reloading {0:10}".format(
service_name))
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.valide(self, "Reloading {0:10}".format(
return True service_name))
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.failed(self, "Reloading {0:10}".format(
service_name))
return False return False
except OSError as e: except OSError as e:
Log.debug(self, "{0}".format(e)) Log.debug(self, "{0}".format(e))

View File

@@ -1,7 +1,8 @@
"""WordOps Shell Functions""" """WordOps Shell Functions"""
from wo.core.logging import Log
import subprocess import subprocess
from wo.core.logging import Log
class CommandExecutionError(Exception): class CommandExecutionError(Exception):
"""custom Exception for command execution""" """custom Exception for command execution"""

View File

@@ -1,12 +1,16 @@
import csv
import os import os
import re
from wo.core.fileutils import WOFileUtils
from wo.core.logging import Log from wo.core.logging import Log
from wo.core.shellexec import WOShellExec from wo.core.shellexec import WOShellExec
from wo.core.variables import WOVariables
class SSL: class SSL:
def getExpirationDays(self, domain, returnonerror=False): def getexpirationdays(self, domain, returnonerror=False):
# check if exist # check if exist
if not os.path.isfile('/etc/letsencrypt/live/{0}/cert.pem' if not os.path.isfile('/etc/letsencrypt/live/{0}/cert.pem'
.format(domain)): .format(domain)):
@@ -33,7 +37,7 @@ class SSL:
# return "Certificate Already Expired ! Please Renew soon." # return "Certificate Already Expired ! Please Renew soon."
return -1 return -1
def getExpirationDate(self, domain): def getexpirationdate(self, domain):
# check if exist # check if exist
if not os.path.isfile('/etc/letsencrypt/live/{0}/cert.pem' if not os.path.isfile('/etc/letsencrypt/live/{0}/cert.pem'
.format(domain)): .format(domain)):
@@ -49,3 +53,61 @@ class SSL:
"\"Not After\" | cut -c 25-)\" " "\"Not After\" | cut -c 25-)\" "
.format(domain)) .format(domain))
return expiration_date return expiration_date
def siteurlhttps(self, domain):
wo_site_webroot = ('/var/www/{0}'.format(domain))
WOFileUtils.chdir(
self, '{0}/htdocs/'.format(wo_site_webroot))
if WOShellExec.cmd_exec(
self, "{0} --allow-root core is-installed"
.format(WOVariables.wo_wp_cli)):
wo_siteurl = (
WOShellExec.cmd_exec_stdout(
self, "{0} option get siteurl "
.format(WOVariables.wo_wpcli_path) +
"--allow-root --quiet"))
test_url = re.split(":", wo_siteurl)
if not (test_url[0] == 'https'):
WOShellExec.cmd_exec(
self, "{0} option update siteurl "
"\'https://{1}\' --allow-root".format(
WOVariables.wo_wpcli_path, domain))
WOShellExec.cmd_exec(
self, "{0} option update home "
"\'https://{1}\' --allow-root".format(
WOVariables.wo_wpcli_path, domain))
WOShellExec.cmd_exec(
self, "{0} search-replace \'http://{0}\'"
"\'https://{0}\' --skip-columns=guid "
"--skip-tables=wp_users"
.format(domain))
Log.info(
self, "Site address updated "
"successfully to https://{0}".format(domain))
# check if a wildcard exist to secure a new subdomain
def checkwildcardexist(self, wo_domain_name):
wo_acme_exec = ("/etc/letsencrypt/acme.sh --config-home "
"'/etc/letsencrypt/config'")
# export certificates list from acme.sh
WOShellExec.cmd_exec(
self, "{0} ".format(wo_acme_exec) +
"--list --listraw > /var/lib/wo/cert.csv")
# define new csv dialect
csv.register_dialect('acmeconf', delimiter='|')
# open file
certfile = open('/var/lib/wo/cert.csv', mode='r', encoding='utf-8')
reader = csv.reader(certfile, 'acmeconf')
wo_wildcard_domain = ("*.{0}".format(wo_domain_name))
for row in reader:
if wo_wildcard_domain in row[2]:
iswildcard = True
break
else:
iswildcard = False
certfile.close()
return iswildcard

View File

@@ -1,6 +1,8 @@
from wo.core.logging import Log
import os import os
from wo.core.logging import Log
""" """
Render Templates Render Templates
""" """

View File

@@ -1,16 +1,17 @@
"""WordOps core variable module""" """WordOps core variable module"""
import distro
import socket
import configparser import configparser
import os
import datetime import datetime
import os
import socket
import distro
class WOVariables(): class WOVariables():
"""Intialization of core variables""" """Intialization of core variables"""
# WordOps version # WordOps version
wo_version = "3.9.8.9" wo_version = "3.9.8.10"
# 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"
@@ -144,21 +145,13 @@ class WOVariables():
"10.3/debian {codename} main" "10.3/debian {codename} main"
.format(codename=wo_platform_codename)) .format(codename=wo_platform_codename))
if wo_distro == 'raspbian':
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysqldb"]
elif wo_platform_codename == 'jessie':
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysql.connector"]
else:
wo_mysql = ["mariadb-server", "percona-toolkit",
"python3-mysqldb", "mariadb-backup"]
if wo_platform_codename == 'jessie': if wo_platform_codename == 'jessie':
wo_mysql_client = ["mariadb-client", "python3-mysqldb"] wo_mysql_client = ["mariadb-client", "python3-mysqldb"]
else: else:
wo_mysql_client = ["mariadb-client", "python3-mysql.connector"] wo_mysql_client = ["mariadb-client", "python3-mysql.connector"]
wo_fail2ban = ["fail2ban"] wo_fail2ban = ["fail2ban"]
wo_clamav = ["clamav", "clamav-freshclam"] wo_clamav = ["clamav", "clamav-freshclam"]
@@ -170,7 +163,7 @@ class WOVariables():
wo_redis_repo = ("deb https://packages.sury.org/php/ {codename} all" wo_redis_repo = ("deb https://packages.sury.org/php/ {codename} all"
.format(codename=wo_platform_codename)) .format(codename=wo_platform_codename))
wo_redis = ['redis-server', 'php-redis'] wo_redis = ['redis-server']
# Repo path # Repo path
wo_repo_file = "wo-repo.list" wo_repo_file = "wo-repo.list"