2018-11-13 21:55:59 +01:00
|
|
|
"""Stack Plugin for WordOps"""
|
|
|
|
|
|
2019-07-25 08:24:02 +02:00
|
|
|
from cement.core.controller import CementBaseController, expose
|
2019-08-05 04:56:33 +02:00
|
|
|
from cement.core import handler, hook
|
2019-07-25 08:24:02 +02:00
|
|
|
|
|
|
|
|
import codecs
|
2018-11-13 21:55:59 +01:00
|
|
|
import configparser
|
2019-07-25 08:24:02 +02:00
|
|
|
import os
|
|
|
|
|
import pwd
|
|
|
|
|
import random
|
|
|
|
|
import shutil
|
|
|
|
|
import string
|
2019-08-02 01:05:09 +02:00
|
|
|
import re
|
2019-08-04 12:36:42 +02:00
|
|
|
import requests
|
2019-07-25 08:24:02 +02:00
|
|
|
|
2019-06-19 21:18:32 +02:00
|
|
|
import psutil
|
2019-07-25 08:24:02 +02:00
|
|
|
# from pynginxconfig import NginxConfig
|
|
|
|
|
from wo.cli.plugins.site_functions import *
|
|
|
|
|
from wo.cli.plugins.sitedb import *
|
2018-11-13 21:55:59 +01:00
|
|
|
from wo.cli.plugins.stack_migrate import WOStackMigrateController
|
2019-07-25 08:24:02 +02:00
|
|
|
from wo.cli.plugins.stack_services import WOStackStatusController
|
2018-11-13 21:55:59 +01:00
|
|
|
from wo.cli.plugins.stack_upgrade import WOStackUpgradeController
|
2019-08-05 04:56:33 +02:00
|
|
|
from wo.cli.plugins.stack_pref import pre_pref, post_pref
|
2019-07-25 08:24:02 +02:00
|
|
|
from wo.core.addswap import WOSwap
|
|
|
|
|
from wo.core.apt_repo import WORepo
|
|
|
|
|
from wo.core.aptget import WOAptGet
|
|
|
|
|
from wo.core.cron import WOCron
|
|
|
|
|
from wo.core.download import WODownload
|
|
|
|
|
from wo.core.extract import WOExtract
|
|
|
|
|
from wo.core.fileutils import WOFileUtils
|
|
|
|
|
from wo.core.git import WOGit
|
2018-11-13 21:55:59 +01:00
|
|
|
from wo.core.logging import Log
|
2019-07-25 08:24:02 +02:00
|
|
|
from wo.core.mysql import WOMysql
|
|
|
|
|
from wo.core.services import WOService
|
|
|
|
|
from wo.core.shellexec import CommandExecutionError, WOShellExec
|
|
|
|
|
from wo.core.variables import WOVariables
|
2018-11-13 21:55:59 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def wo_stack_hook(app):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WOStackController(CementBaseController):
|
|
|
|
|
class Meta:
|
|
|
|
|
label = 'stack'
|
|
|
|
|
stacked_on = 'base'
|
|
|
|
|
stacked_type = 'nested'
|
|
|
|
|
description = 'Stack command manages stack operations'
|
|
|
|
|
arguments = [
|
|
|
|
|
(['--all'],
|
|
|
|
|
dict(help='Install all stacks at once', action='store_true')),
|
|
|
|
|
(['--web'],
|
|
|
|
|
dict(help='Install web stack', action='store_true')),
|
|
|
|
|
(['--admin'],
|
|
|
|
|
dict(help='Install admin tools stack', action='store_true')),
|
2019-07-19 15:21:17 +02:00
|
|
|
(['--security'],
|
|
|
|
|
dict(help='Install security tools stack', action='store_true')),
|
2018-11-13 21:55:59 +01:00
|
|
|
(['--nginx'],
|
|
|
|
|
dict(help='Install Nginx stack', action='store_true')),
|
|
|
|
|
(['--php'],
|
|
|
|
|
dict(help='Install PHP 7.2 stack', action='store_true')),
|
2019-03-02 20:38:31 +01:00
|
|
|
(['--php73'],
|
|
|
|
|
dict(help='Install PHP 7.3 stack', action='store_true')),
|
2018-11-13 21:55:59 +01:00
|
|
|
(['--mysql'],
|
|
|
|
|
dict(help='Install MySQL stack', action='store_true')),
|
|
|
|
|
(['--wpcli'],
|
|
|
|
|
dict(help='Install WPCLI stack', action='store_true')),
|
|
|
|
|
(['--phpmyadmin'],
|
|
|
|
|
dict(help='Install PHPMyAdmin stack', action='store_true')),
|
2019-04-01 20:59:53 +02:00
|
|
|
(['--composer'],
|
|
|
|
|
dict(help='Install Composer stack', action='store_true')),
|
|
|
|
|
(['--netdata'],
|
2019-04-02 01:59:40 +02:00
|
|
|
dict(help='Install Netdata monitoring suite',
|
|
|
|
|
action='store_true')),
|
2019-04-23 19:03:42 +02:00
|
|
|
(['--dashboard'],
|
|
|
|
|
dict(help='Install WordOps dashboard', action='store_true')),
|
2018-11-13 21:55:59 +01:00
|
|
|
(['--adminer'],
|
|
|
|
|
dict(help='Install Adminer stack', action='store_true')),
|
2019-04-25 01:38:14 +02:00
|
|
|
(['--fail2ban'],
|
|
|
|
|
dict(help='Install Fail2ban stack', action='store_true')),
|
2018-11-13 21:55:59 +01:00
|
|
|
(['--utils'],
|
|
|
|
|
dict(help='Install Utils stack', action='store_true')),
|
|
|
|
|
(['--redis'],
|
|
|
|
|
dict(help='Install Redis', action='store_true')),
|
|
|
|
|
(['--phpredisadmin'],
|
|
|
|
|
dict(help='Install phpRedisAdmin', action='store_true')),
|
2019-07-19 13:47:29 +02:00
|
|
|
(['--proftpd'],
|
|
|
|
|
dict(help='Install ProFTPd', action='store_true')),
|
2019-03-02 20:38:31 +01:00
|
|
|
]
|
2019-03-04 06:44:21 +01:00
|
|
|
usage = "wo stack (command) [options]"
|
2018-11-13 21:55:59 +01:00
|
|
|
|
|
|
|
|
@expose(hide=True)
|
|
|
|
|
def default(self):
|
|
|
|
|
"""default action of wo stack command"""
|
|
|
|
|
self.app.args.print_help()
|
|
|
|
|
|
|
|
|
|
@expose(help="Install packages")
|
|
|
|
|
def install(self, packages=[], apt_packages=[], disp_msg=True):
|
|
|
|
|
"""Start installation of packages"""
|
|
|
|
|
self.msg = []
|
|
|
|
|
try:
|
|
|
|
|
# Default action for stack installation
|
|
|
|
|
if ((not self.app.pargs.web) and (not self.app.pargs.admin) and
|
2019-03-02 20:38:31 +01:00
|
|
|
(not self.app.pargs.nginx) and (not self.app.pargs.php) and
|
|
|
|
|
(not self.app.pargs.mysql) and (not self.app.pargs.wpcli) and
|
2019-03-08 00:43:25 +01:00
|
|
|
(not self.app.pargs.phpmyadmin) and
|
2019-04-03 07:53:25 +02:00
|
|
|
(not self.app.pargs.composer) and
|
|
|
|
|
(not self.app.pargs.netdata) and
|
2019-04-23 19:03:42 +02:00
|
|
|
(not self.app.pargs.dashboard) and
|
2019-07-18 17:04:20 +02:00
|
|
|
(not self.app.pargs.fail2ban) and
|
2019-07-19 15:21:17 +02:00
|
|
|
(not self.app.pargs.security) and
|
2019-03-02 20:38:31 +01:00
|
|
|
(not self.app.pargs.adminer) and (not self.app.pargs.utils) and
|
2019-07-19 13:47:29 +02:00
|
|
|
(not self.app.pargs.redis) and (not self.app.pargs.proftpd) and
|
2019-03-08 00:43:25 +01:00
|
|
|
(not self.app.pargs.phpredisadmin) and
|
2019-03-02 20:38:31 +01:00
|
|
|
(not self.app.pargs.php73)):
|
2018-11-13 21:55:59 +01:00
|
|
|
self.app.pargs.web = True
|
|
|
|
|
self.app.pargs.admin = True
|
2019-07-19 15:21:17 +02:00
|
|
|
self.app.pargs.security = True
|
2018-11-13 21:55:59 +01:00
|
|
|
|
|
|
|
|
if self.app.pargs.all:
|
|
|
|
|
self.app.pargs.web = True
|
|
|
|
|
self.app.pargs.admin = True
|
2019-07-10 14:05:19 +02:00
|
|
|
self.app.pargs.php73 = True
|
2019-07-14 22:50:34 +02:00
|
|
|
self.app.pargs.redis = True
|
2019-07-19 13:47:29 +02:00
|
|
|
self.app.pargs.proftpd = True
|
2018-11-13 21:55:59 +01:00
|
|
|
|
|
|
|
|
if self.app.pargs.web:
|
|
|
|
|
self.app.pargs.nginx = True
|
|
|
|
|
self.app.pargs.php = True
|
|
|
|
|
self.app.pargs.mysql = True
|
|
|
|
|
self.app.pargs.wpcli = True
|
|
|
|
|
|
|
|
|
|
if self.app.pargs.admin:
|
|
|
|
|
self.app.pargs.nginx = True
|
|
|
|
|
self.app.pargs.php = True
|
|
|
|
|
self.app.pargs.mysql = True
|
|
|
|
|
self.app.pargs.adminer = True
|
|
|
|
|
self.app.pargs.phpmyadmin = True
|
2019-04-01 22:19:44 +02:00
|
|
|
self.app.pargs.composer = True
|
2018-11-13 21:55:59 +01:00
|
|
|
self.app.pargs.utils = True
|
2019-04-03 07:41:29 +02:00
|
|
|
self.app.pargs.netdata = True
|
2019-04-23 19:03:42 +02:00
|
|
|
self.app.pargs.dashboard = True
|
2019-06-19 17:14:26 +02:00
|
|
|
self.app.pargs.phpredisadmin = True
|
2019-07-19 15:21:17 +02:00
|
|
|
|
|
|
|
|
if self.app.pargs.security:
|
2019-07-18 17:04:20 +02:00
|
|
|
self.app.pargs.fail2ban = True
|
2018-11-13 21:55:59 +01:00
|
|
|
|
2019-04-23 19:03:42 +02:00
|
|
|
# Redis
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.redis:
|
|
|
|
|
if not WOAptGet.is_installed(self, 'redis-server'):
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_redis
|
|
|
|
|
self.app.pargs.php = True
|
|
|
|
|
else:
|
|
|
|
|
Log.info(self, "Redis already installed")
|
|
|
|
|
|
2019-04-23 19:03:42 +02:00
|
|
|
# Nginx
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.nginx:
|
|
|
|
|
Log.debug(self, "Setting apt_packages variable for Nginx")
|
|
|
|
|
|
|
|
|
|
if not (WOAptGet.is_installed(self, 'nginx-custom')):
|
2019-03-08 00:43:25 +01:00
|
|
|
if not (WOAptGet.is_installed(self, 'nginx-plus') or
|
|
|
|
|
WOAptGet.is_installed(self, 'nginx')):
|
2018-11-13 21:55:59 +01:00
|
|
|
apt_packages = apt_packages + WOVariables.wo_nginx
|
|
|
|
|
else:
|
|
|
|
|
if WOAptGet.is_installed(self, 'nginx-plus'):
|
|
|
|
|
Log.info(self, "NGINX PLUS Detected ...")
|
|
|
|
|
apt = ["nginx-plus"] + WOVariables.wo_nginx
|
|
|
|
|
self.post_pref(apt, packages)
|
|
|
|
|
elif WOAptGet.is_installed(self, 'nginx'):
|
2019-04-03 07:53:25 +02:00
|
|
|
Log.info(self, "WordOps detected an already "
|
|
|
|
|
"installed nginx package."
|
|
|
|
|
"It may or may not have "
|
|
|
|
|
"required modules.\n")
|
2018-11-13 21:55:59 +01:00
|
|
|
apt = ["nginx"] + WOVariables.wo_nginx
|
|
|
|
|
self.post_pref(apt, packages)
|
|
|
|
|
else:
|
|
|
|
|
Log.debug(self, "Nginx Stable already installed")
|
|
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHP 7.2
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.php:
|
2019-03-03 14:54:12 +01:00
|
|
|
Log.debug(self, "Setting apt_packages variable for PHP 7.2")
|
2019-03-08 00:43:25 +01:00
|
|
|
if not (WOAptGet.is_installed(self, 'php7.2-fpm')):
|
2019-03-16 09:18:15 +01:00
|
|
|
if not (WOAptGet.is_installed(self, 'php7.3-fpm')):
|
2019-04-01 20:59:53 +02:00
|
|
|
apt_packages = apt_packages + WOVariables.wo_php + \
|
2019-04-01 22:19:44 +02:00
|
|
|
WOVariables.wo_php_extra
|
2019-03-16 09:18:15 +01:00
|
|
|
else:
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_php
|
2018-11-13 21:55:59 +01:00
|
|
|
else:
|
2019-03-03 14:54:12 +01:00
|
|
|
Log.debug(self, "PHP 7.2 already installed")
|
|
|
|
|
Log.info(self, "PHP 7.2 already installed")
|
2018-11-13 21:55:59 +01:00
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHP 7.3
|
|
|
|
|
if self.app.pargs.php73:
|
2019-03-08 00:43:25 +01:00
|
|
|
Log.debug(self, "Setting apt_packages variable for PHP 7.3")
|
|
|
|
|
if not WOAptGet.is_installed(self, 'php7.3-fpm'):
|
2019-03-16 09:18:15 +01:00
|
|
|
if not (WOAptGet.is_installed(self, 'php7.2-fpm')):
|
2019-04-01 20:59:53 +02:00
|
|
|
apt_packages = apt_packages + WOVariables.wo_php + \
|
|
|
|
|
WOVariables.wo_php73 + WOVariables.wo_php_extra
|
2019-03-16 09:18:15 +01:00
|
|
|
else:
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_php73
|
2018-11-13 21:55:59 +01:00
|
|
|
else:
|
2019-03-08 00:43:25 +01:00
|
|
|
Log.debug(self, "PHP 7.3 already installed")
|
|
|
|
|
Log.info(self, "PHP 7.3 already installed")
|
2018-11-13 21:55:59 +01:00
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# MariaDB 10.3
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.mysql:
|
|
|
|
|
Log.debug(self, "Setting apt_packages variable for MySQL")
|
|
|
|
|
if not WOShellExec.cmd_exec(self, "mysqladmin ping"):
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_mysql
|
|
|
|
|
packages = packages + [["https://raw."
|
|
|
|
|
"githubusercontent.com/"
|
|
|
|
|
"major/MySQLTuner-perl"
|
|
|
|
|
"/master/mysqltuner.pl",
|
|
|
|
|
"/usr/bin/mysqltuner",
|
|
|
|
|
"MySQLTuner"]]
|
2019-07-29 11:23:23 +02:00
|
|
|
|
2018-11-13 21:55:59 +01:00
|
|
|
else:
|
|
|
|
|
Log.debug(self, "MySQL connection is already alive")
|
|
|
|
|
Log.info(self, "MySQL connection is already alive")
|
|
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# WP-CLI
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.wpcli:
|
|
|
|
|
Log.debug(self, "Setting packages variable for WP-CLI")
|
2019-03-02 20:38:31 +01:00
|
|
|
if not WOShellExec.cmd_exec(self, "command -v wp"):
|
2018-11-13 21:55:59 +01:00
|
|
|
packages = packages + [["https://github.com/wp-cli/wp-cli/"
|
|
|
|
|
"releases/download/v{0}/"
|
|
|
|
|
"wp-cli-{0}.phar"
|
|
|
|
|
"".format(WOVariables.wo_wp_cli),
|
2019-03-04 07:12:57 +01:00
|
|
|
"/usr/local/bin/wp",
|
2018-11-13 21:55:59 +01:00
|
|
|
"WP-CLI"]]
|
|
|
|
|
else:
|
|
|
|
|
Log.debug(self, "WP-CLI is already installed")
|
|
|
|
|
Log.info(self, "WP-CLI is already installed")
|
2019-03-15 16:45:10 +01:00
|
|
|
|
2019-04-25 01:38:14 +02:00
|
|
|
# fail2ban
|
|
|
|
|
if self.app.pargs.fail2ban:
|
|
|
|
|
Log.debug(self, "Setting apt_packages variable for Fail2ban")
|
|
|
|
|
if not WOAptGet.is_installed(self, 'fail2ban'):
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_fail2ban
|
|
|
|
|
else:
|
|
|
|
|
Log.debug(self, "Fail2ban already installed")
|
|
|
|
|
Log.info(self, "Fail2ban already installed")
|
|
|
|
|
|
2019-07-19 13:47:29 +02:00
|
|
|
# proftpd
|
|
|
|
|
if self.app.pargs.proftpd:
|
|
|
|
|
Log.debug(self, "Setting apt_packages variable for ProFTPd")
|
|
|
|
|
if not WOAptGet.is_installed(self, 'proftpd-basic'):
|
|
|
|
|
apt_packages = apt_packages + ["proftpd-basic"]
|
|
|
|
|
else:
|
|
|
|
|
Log.debug(self, "ProFTPd already installed")
|
|
|
|
|
Log.info(self, "ProFTPd already installed")
|
|
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHPMYADMIN
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.phpmyadmin:
|
2019-07-16 17:15:17 +02:00
|
|
|
if not os.path.isdir('/var/www/22222/htdocs/db/pma'):
|
|
|
|
|
Log.debug(self, "Setting packages variable "
|
|
|
|
|
"for phpMyAdmin ")
|
|
|
|
|
self.app.pargs.composer = True
|
|
|
|
|
packages = packages + [["https://github.com/phpmyadmin/"
|
|
|
|
|
"phpmyadmin/archive/STABLE.tar.gz",
|
|
|
|
|
"/var/lib/wo/tmp/pma.tar.gz",
|
|
|
|
|
"phpMyAdmin"]]
|
2019-07-19 17:42:57 +02:00
|
|
|
else:
|
|
|
|
|
Log.debug(self, "phpMyAdmin already installed")
|
|
|
|
|
Log.info(self, "phpMyAdmin already installed")
|
|
|
|
|
|
2019-04-01 20:59:53 +02:00
|
|
|
# Composer
|
|
|
|
|
if self.app.pargs.composer:
|
2019-07-19 17:42:57 +02:00
|
|
|
if not os.path.isfile('/usr/local/bin/composer'):
|
|
|
|
|
Log.debug(self, "Setting packages variable for Composer ")
|
|
|
|
|
packages = packages + [["https://getcomposer.org/"
|
|
|
|
|
"installer",
|
|
|
|
|
"/var/lib/wo/tmp/composer-install",
|
|
|
|
|
"Composer"]]
|
|
|
|
|
else:
|
|
|
|
|
Log.debug(self, "Composer already installed")
|
|
|
|
|
Log.info(self, "Composer already installed")
|
|
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHPREDISADMIN
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.phpredisadmin:
|
2019-08-02 01:05:09 +02:00
|
|
|
if not os.path.isdir('/var/www/22222/htdocs/'
|
|
|
|
|
'cache/redis/phpRedisAdmin'):
|
2019-07-16 17:15:17 +02:00
|
|
|
Log.debug(
|
|
|
|
|
self, "Setting packages variable for phpRedisAdmin")
|
|
|
|
|
self.app.pargs.composer = True
|
|
|
|
|
packages = packages + [["https://github.com/"
|
|
|
|
|
"erikdubbelboer/"
|
|
|
|
|
"phpRedisAdmin/archive"
|
2019-07-16 18:51:04 +02:00
|
|
|
"/v1.11.3.tar.gz",
|
2019-07-16 17:15:17 +02:00
|
|
|
"/var/lib/wo/tmp/pra.tar.gz",
|
|
|
|
|
"phpRedisAdmin"]]
|
2019-07-19 17:42:57 +02:00
|
|
|
else:
|
|
|
|
|
Log.debug(self, "phpRedisAdmin already installed")
|
|
|
|
|
Log.info(self, "phpRedisAdmin already installed")
|
|
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# ADMINER
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.adminer:
|
2019-07-27 22:08:16 +02:00
|
|
|
Log.debug(self, "Setting packages variable for Adminer ")
|
|
|
|
|
packages = packages + [["https://github.com/vrana/adminer/"
|
|
|
|
|
"releases/download/v{0}"
|
|
|
|
|
"/adminer-{0}.php"
|
|
|
|
|
.format(WOVariables.wo_adminer),
|
|
|
|
|
"{0}22222/"
|
|
|
|
|
"htdocs/db/adminer/index.php"
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
"Adminer"],
|
|
|
|
|
["https://raw.githubusercontent.com"
|
|
|
|
|
"/vrana/adminer/master/designs/"
|
|
|
|
|
"pepa-linha/adminer.css",
|
|
|
|
|
"{0}22222/"
|
|
|
|
|
"htdocs/db/adminer/adminer.css"
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
"Adminer theme"]]
|
2019-04-16 08:50:15 +02:00
|
|
|
|
2019-04-02 01:59:40 +02:00
|
|
|
# Netdata
|
|
|
|
|
if self.app.pargs.netdata:
|
|
|
|
|
Log.debug(self, "Setting packages variable for Netdata")
|
2019-04-03 07:53:25 +02:00
|
|
|
if not os.path.exists('/opt/netdata'):
|
|
|
|
|
packages = packages + [['https://my-netdata.io/'
|
2019-04-23 19:03:42 +02:00
|
|
|
'kickstart-static64.sh',
|
2019-05-01 12:06:39 +02:00
|
|
|
'/var/lib/wo/tmp/kickstart.sh',
|
2019-04-03 07:53:25 +02:00
|
|
|
'Netdata']]
|
2019-07-19 17:42:57 +02:00
|
|
|
else:
|
|
|
|
|
Log.debug(self, "Netdata already installed")
|
|
|
|
|
Log.info(self, "Netdata already installed")
|
2019-04-02 01:59:40 +02:00
|
|
|
|
2019-04-23 19:03:42 +02:00
|
|
|
# WordOps Dashboard
|
|
|
|
|
if self.app.pargs.dashboard:
|
2019-07-16 17:15:17 +02:00
|
|
|
if not os.path.isfile('/var/www/22222/htdocs/index.php'):
|
|
|
|
|
Log.debug(
|
|
|
|
|
self, "Setting packages variable for WO-Dashboard")
|
|
|
|
|
packages = packages + \
|
|
|
|
|
[["https://github.com/WordOps/"
|
|
|
|
|
"wordops-dashboard/releases/"
|
|
|
|
|
"download/v1.0/wo-dashboard.tar.gz",
|
|
|
|
|
"/var/lib/wo/tmp/wo-dashboard.tar.gz",
|
|
|
|
|
"WordOps Dashboard"],
|
|
|
|
|
["https://github.com/soerennb/"
|
2019-07-27 22:08:16 +02:00
|
|
|
"extplorer/archive/v{0}.tar.gz"
|
|
|
|
|
.format(WOVariables.wo_extplorer),
|
2019-07-16 17:15:17 +02:00
|
|
|
"/var/lib/wo/tmp/extplorer.tar.gz",
|
|
|
|
|
"eXtplorer"]]
|
2019-07-19 17:42:57 +02:00
|
|
|
else:
|
|
|
|
|
Log.debug(self, "WordOps dashboard already installed")
|
|
|
|
|
Log.info(self, "WordOps dashboard already installed")
|
2019-04-23 19:03:42 +02:00
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# UTILS
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.utils:
|
|
|
|
|
Log.debug(self, "Setting packages variable for utils")
|
2019-07-13 04:16:36 +02:00
|
|
|
packages = packages + [["https://raw.githubusercontent.com"
|
2018-11-13 21:55:59 +01:00
|
|
|
"/rtCamp/eeadmin/master/cache/nginx/"
|
|
|
|
|
"clean.php",
|
|
|
|
|
"{0}22222/htdocs/cache/"
|
|
|
|
|
"nginx/clean.php"
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
"clean.php"],
|
|
|
|
|
["https://raw.github.com/rlerdorf/"
|
|
|
|
|
"opcache-status/master/opcache.php",
|
|
|
|
|
"{0}22222/htdocs/cache/"
|
|
|
|
|
"opcache/opcache.php"
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
"opcache.php"],
|
|
|
|
|
["https://raw.github.com/amnuts/"
|
|
|
|
|
"opcache-gui/master/index.php",
|
|
|
|
|
"{0}22222/htdocs/"
|
|
|
|
|
"cache/opcache/opgui.php"
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
"Opgui"],
|
|
|
|
|
["https://gist.github.com/ck-on/4959032"
|
|
|
|
|
"/raw/0b871b345fd6cfcd6d2be030c1f33d1"
|
|
|
|
|
"ad6a475cb/ocp.php",
|
|
|
|
|
"{0}22222/htdocs/cache/"
|
|
|
|
|
"opcache/ocp.php"
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
"OCP.php"],
|
|
|
|
|
["https://github.com/jokkedk/webgrind/"
|
|
|
|
|
"archive/master.tar.gz",
|
2019-05-02 13:45:45 +02:00
|
|
|
'/var/lib/wo/tmp/webgrind.tar.gz',
|
|
|
|
|
'Webgrind'],
|
2019-07-13 04:50:28 +02:00
|
|
|
["https://www.percona.com/"
|
|
|
|
|
"get/pt-query-digest",
|
2018-11-13 21:55:59 +01:00
|
|
|
"/usr/bin/pt-query-advisor",
|
|
|
|
|
"pt-query-advisor"],
|
|
|
|
|
["https://github.com/box/Anemometer/"
|
|
|
|
|
"archive/master.tar.gz",
|
2019-05-02 13:45:45 +02:00
|
|
|
'/var/lib/wo/tmp/anemometer.tar.gz',
|
|
|
|
|
'Anemometer']
|
2018-11-13 21:55:59 +01:00
|
|
|
]
|
|
|
|
|
except Exception as e:
|
2019-07-29 15:08:49 +02:00
|
|
|
Log.debug(self, "{0}".format(e))
|
2018-11-13 21:55:59 +01:00
|
|
|
|
2019-04-30 18:50:30 +02:00
|
|
|
if (apt_packages) or (packages):
|
2019-07-17 03:00:53 +02:00
|
|
|
Log.debug(self, "Calling pre_pref")
|
2019-08-05 04:56:33 +02:00
|
|
|
pre_pref(self, apt_packages)
|
2019-04-30 18:50:30 +02:00
|
|
|
if (apt_packages):
|
2019-07-30 12:24:56 +02:00
|
|
|
meminfo = (os.popen('cat /proc/meminfo '
|
2019-07-30 13:42:17 +02:00
|
|
|
'| grep MemTotal').read()).split(":")
|
|
|
|
|
memsplit = re.split(" kB", meminfo[1])
|
2019-07-30 13:42:57 +02:00
|
|
|
wo_mem = int(memsplit[0])
|
2019-07-30 13:26:39 +02:00
|
|
|
if (wo_mem < 4000000):
|
2019-07-30 12:24:56 +02:00
|
|
|
WOSwap.add(self)
|
2018-11-13 21:55:59 +01:00
|
|
|
Log.info(self, "Updating apt-cache, please wait...")
|
|
|
|
|
WOAptGet.update(self)
|
|
|
|
|
Log.info(self, "Installing packages, please wait...")
|
2019-07-17 03:00:53 +02:00
|
|
|
WOAptGet.install(self, apt_packages)
|
2019-04-30 18:50:30 +02:00
|
|
|
if (packages):
|
2018-11-13 21:55:59 +01:00
|
|
|
Log.debug(self, "Downloading following: {0}".format(packages))
|
|
|
|
|
WODownload.download(self, packages)
|
2019-07-17 03:00:53 +02:00
|
|
|
Log.debug(self, "Calling post_pref")
|
2019-08-05 04:56:33 +02:00
|
|
|
post_pref(self, apt_packages, packages)
|
2018-11-13 21:55:59 +01:00
|
|
|
if 'redis-server' in apt_packages:
|
|
|
|
|
# set redis.conf parameter
|
|
|
|
|
# set maxmemory 10% for ram below 512MB and 20% for others
|
|
|
|
|
# set maxmemory-policy allkeys-lru
|
2019-03-27 12:49:17 +01:00
|
|
|
# enable systemd service
|
|
|
|
|
Log.debug(self, "Enabling redis systemd service")
|
|
|
|
|
WOShellExec.cmd_exec(self, "systemctl enable redis-server")
|
2018-11-13 21:55:59 +01:00
|
|
|
if os.path.isfile("/etc/redis/redis.conf"):
|
2019-06-19 21:18:32 +02:00
|
|
|
wo_ram = psutil.virtual_memory().total / (1024 * 1024)
|
2019-08-02 01:05:09 +02:00
|
|
|
if wo_ram < 1024:
|
2019-04-11 20:35:03 +02:00
|
|
|
Log.debug(self, "Setting maxmemory variable to "
|
|
|
|
|
"{0} in redis.conf"
|
2019-06-19 21:18:32 +02:00
|
|
|
.format(int(wo_ram*1024*1024*0.1)))
|
2019-08-02 01:05:09 +02:00
|
|
|
WOFileUtils.searchreplace(self,
|
|
|
|
|
"/etc/redis/redis.conf",
|
|
|
|
|
"# maxmemory <bytes>",
|
|
|
|
|
"maxmemory {0}"
|
|
|
|
|
.format
|
|
|
|
|
(int(wo_ram*1024*1024*0.1)))
|
2019-03-02 20:38:31 +01:00
|
|
|
Log.debug(
|
2019-04-11 20:35:03 +02:00
|
|
|
self, "Setting maxmemory-policy variable to "
|
|
|
|
|
"allkeys-lru in redis.conf")
|
2019-08-02 01:05:09 +02:00
|
|
|
WOFileUtils.searchreplace(self,
|
|
|
|
|
"/etc/redis/redis.conf",
|
|
|
|
|
"# maxmemory-policy "
|
|
|
|
|
"noeviction",
|
|
|
|
|
"maxmemory-policy "
|
|
|
|
|
"allkeys-lru")
|
|
|
|
|
Log.debug(
|
|
|
|
|
self, "Setting tcp-backlog variable to "
|
|
|
|
|
"in redis.conf")
|
|
|
|
|
WOFileUtils.searchreplace(self,
|
|
|
|
|
"/etc/redis/redis.conf",
|
|
|
|
|
"tcp-backlog 511",
|
|
|
|
|
"tcp-backlog 32768")
|
2019-03-27 12:49:17 +01:00
|
|
|
|
2018-11-13 21:55:59 +01:00
|
|
|
WOService.restart_service(self, 'redis-server')
|
|
|
|
|
else:
|
2019-04-11 20:35:03 +02:00
|
|
|
Log.debug(self, "Setting maxmemory variable to {0} "
|
|
|
|
|
"in redis.conf"
|
2019-06-19 21:18:32 +02:00
|
|
|
.format(int(wo_ram*1024*1024*0.2)))
|
2019-08-02 01:05:09 +02:00
|
|
|
WOFileUtils.searchreplace(self,
|
|
|
|
|
"/etc/redis/redis.conf",
|
|
|
|
|
"# maxmemory <bytes>",
|
|
|
|
|
"maxmemory {0}"
|
|
|
|
|
.format
|
|
|
|
|
(int(wo_ram*1024*1024*0.1)))
|
2019-03-02 20:38:31 +01:00
|
|
|
Log.debug(
|
2019-04-11 20:35:03 +02:00
|
|
|
self, "Setting maxmemory-policy variable "
|
|
|
|
|
"to allkeys-lru in redis.conf")
|
2019-08-02 01:05:09 +02:00
|
|
|
WOFileUtils.searchreplace(self,
|
|
|
|
|
"/etc/redis/redis.conf",
|
|
|
|
|
"# maxmemory-policy "
|
|
|
|
|
"noeviction",
|
|
|
|
|
"maxmemory-policy "
|
|
|
|
|
"allkeys-lru")
|
2019-08-08 23:41:28 +02:00
|
|
|
WOFileUtils.chown(self, '/etc/redis/redis.conf',
|
|
|
|
|
'redis',
|
|
|
|
|
'redis',
|
|
|
|
|
recursive=False)
|
2018-11-13 21:55:59 +01:00
|
|
|
WOService.restart_service(self, 'redis-server')
|
2019-07-25 11:48:43 +02:00
|
|
|
if 'mariadb-server' in apt_packages:
|
|
|
|
|
# setting innodb memory usage
|
|
|
|
|
wo_ram = psutil.virtual_memory().total / (1024 * 1024)
|
|
|
|
|
wo_ram_innodb = int(wo_ram*0.3)
|
|
|
|
|
wo_ram_log_buffer = int(wo_ram_innodb*0.25)
|
|
|
|
|
wo_ram_log_size = int(wo_ram_log_buffer*0.5)
|
|
|
|
|
# replacing default values
|
|
|
|
|
if os.path.isfile("/etc/mysql/my.cnf"):
|
|
|
|
|
Log.debug(self, "Tuning MySQL configuration")
|
|
|
|
|
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
|
2019-07-25 13:10:33 +02:00
|
|
|
"innodb_buffer_pool_size = 256M",
|
|
|
|
|
"innodb_buffer_pool_size = {0}M"
|
2019-07-25 11:48:43 +02:00
|
|
|
.format(wo_ram_innodb))
|
|
|
|
|
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
|
2019-07-25 13:10:33 +02:00
|
|
|
"innodb_log_buffer_size = 8M",
|
|
|
|
|
"innodb_log_buffer_size = {0}M"
|
2019-07-25 11:48:43 +02:00
|
|
|
.format(wo_ram_log_buffer))
|
|
|
|
|
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
|
2019-07-25 13:10:33 +02:00
|
|
|
"#innodb_log_file_size = 50M",
|
|
|
|
|
"innodb_log_file_size = {0}M"
|
2019-07-25 11:48:43 +02:00
|
|
|
.format(wo_ram_log_size))
|
|
|
|
|
WOFileUtils.searchreplace(self,
|
|
|
|
|
"/etc/mysql/my.cnf",
|
2019-07-25 13:10:33 +02:00
|
|
|
"wait_timeout "
|
2019-07-25 16:47:26 +02:00
|
|
|
"= 600",
|
2019-07-25 13:10:33 +02:00
|
|
|
"wait_timeout "
|
2019-07-25 16:47:26 +02:00
|
|
|
"= 120")
|
2019-07-25 11:48:43 +02:00
|
|
|
# disabling mariadb binlog
|
|
|
|
|
WOFileUtils.searchreplace(self,
|
|
|
|
|
"/etc/mysql/my.cnf",
|
2019-07-25 13:10:33 +02:00
|
|
|
"log_bin "
|
|
|
|
|
"= /var/log/mysql/"
|
|
|
|
|
"mariadb-bin",
|
2019-07-25 11:48:43 +02:00
|
|
|
"#log_bin "
|
|
|
|
|
" = /var/log/"
|
|
|
|
|
"mysql/mariadb-bin")
|
|
|
|
|
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
|
2019-07-25 13:10:33 +02:00
|
|
|
'log_bin_index '
|
2019-07-25 11:48:43 +02:00
|
|
|
"= /var/log/mysql/"
|
|
|
|
|
"mariadb-bin.index",
|
2019-07-25 13:10:33 +02:00
|
|
|
"#log_bin_index "
|
2019-07-25 11:48:43 +02:00
|
|
|
"= /var/log/mysql/"
|
|
|
|
|
"mariadb-bin.index")
|
|
|
|
|
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
|
2019-07-25 13:10:33 +02:00
|
|
|
"expire_logs_days = 10",
|
|
|
|
|
"#expire_logs_days "
|
2019-07-25 11:48:43 +02:00
|
|
|
"= 10")
|
|
|
|
|
WOFileUtils.searchreplace(self, "/etc/mysql/my.cnf",
|
|
|
|
|
"max_binlog_size "
|
|
|
|
|
"= 100M",
|
|
|
|
|
"#max_binlog_size "
|
|
|
|
|
"= 100M")
|
2019-07-25 16:47:26 +02:00
|
|
|
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")
|
2019-07-25 11:48:43 +02:00
|
|
|
WOService.stop_service(self, 'mysql')
|
|
|
|
|
WOFileUtils.mvfile(self, '/var/lib/mysql/ib_logfile0',
|
|
|
|
|
'/var/lib/mysql/ib_logfile0.bak')
|
|
|
|
|
WOFileUtils.mvfile(self, '/var/lib/mysql/ib_logfile1',
|
|
|
|
|
'/var/lib/mysql/ib_logfile1.bak')
|
|
|
|
|
WOService.start_service(self, 'mysql')
|
2019-07-25 11:40:12 +02:00
|
|
|
|
2018-11-13 21:55:59 +01:00
|
|
|
if disp_msg:
|
2019-04-30 18:50:30 +02:00
|
|
|
if (self.msg):
|
2018-11-13 21:55:59 +01:00
|
|
|
for msg in self.msg:
|
|
|
|
|
Log.info(self, Log.ENDC + msg)
|
|
|
|
|
Log.info(self, "Successfully installed packages")
|
|
|
|
|
else:
|
|
|
|
|
return self.msg
|
|
|
|
|
|
|
|
|
|
@expose(help="Remove packages")
|
|
|
|
|
def remove(self):
|
|
|
|
|
"""Start removal of packages"""
|
|
|
|
|
apt_packages = []
|
|
|
|
|
packages = []
|
|
|
|
|
|
|
|
|
|
if ((not self.app.pargs.web) and (not self.app.pargs.admin) and
|
2019-03-02 20:38:31 +01:00
|
|
|
(not self.app.pargs.nginx) and (not self.app.pargs.php) and
|
|
|
|
|
(not self.app.pargs.php73) and (not self.app.pargs.mysql) and
|
|
|
|
|
(not self.app.pargs.wpcli) and (not self.app.pargs.phpmyadmin) and
|
2019-03-13 05:02:53 +01:00
|
|
|
(not self.app.pargs.adminer) and (not self.app.pargs.utils) and
|
2019-04-03 06:59:13 +02:00
|
|
|
(not self.app.pargs.composer) and (not self.app.pargs.netdata) and
|
2019-07-19 13:47:29 +02:00
|
|
|
(not self.app.pargs.fail2ban) and (not self.app.pargs.proftpd) and
|
2019-07-19 15:21:17 +02:00
|
|
|
(not self.app.pargs.security) and
|
2019-03-13 05:02:53 +01:00
|
|
|
(not self.app.pargs.all) and (not self.app.pargs.redis) and
|
2019-03-08 00:43:25 +01:00
|
|
|
(not self.app.pargs.phpredisadmin)):
|
2018-11-13 21:55:59 +01:00
|
|
|
self.app.pargs.web = True
|
|
|
|
|
self.app.pargs.admin = True
|
2019-07-19 15:21:17 +02:00
|
|
|
self.app.pargs.security = True
|
2018-11-13 21:55:59 +01:00
|
|
|
|
|
|
|
|
if self.app.pargs.all:
|
|
|
|
|
self.app.pargs.web = True
|
|
|
|
|
self.app.pargs.admin = True
|
2019-03-15 16:45:10 +01:00
|
|
|
self.app.pargs.php73 = True
|
2018-11-13 21:55:59 +01:00
|
|
|
|
|
|
|
|
if self.app.pargs.web:
|
|
|
|
|
self.app.pargs.nginx = True
|
|
|
|
|
self.app.pargs.php = True
|
|
|
|
|
self.app.pargs.mysql = True
|
|
|
|
|
self.app.pargs.wpcli = True
|
|
|
|
|
|
|
|
|
|
if self.app.pargs.admin:
|
|
|
|
|
self.app.pargs.adminer = True
|
|
|
|
|
self.app.pargs.phpmyadmin = True
|
2019-04-01 20:59:53 +02:00
|
|
|
self.app.pargs.composer = True
|
2018-11-13 21:55:59 +01:00
|
|
|
self.app.pargs.utils = True
|
2019-07-10 14:05:19 +02:00
|
|
|
self.app.pargs.netdata = True
|
2019-07-11 21:07:01 +02:00
|
|
|
self.app.pargs.dashboard = True
|
|
|
|
|
self.app.pargs.phpredisadmin = True
|
2019-07-19 15:21:17 +02:00
|
|
|
|
|
|
|
|
if self.app.pargs.security:
|
2019-07-18 17:04:20 +02:00
|
|
|
self.app.pargs.fail2ban = True
|
2019-07-10 14:05:19 +02:00
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# NGINX
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.nginx:
|
|
|
|
|
if WOAptGet.is_installed(self, 'nginx-custom'):
|
|
|
|
|
Log.debug(self, "Removing apt_packages variable of Nginx")
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_nginx
|
|
|
|
|
else:
|
2019-04-11 20:35:03 +02:00
|
|
|
Log.error(self, "Cannot Remove! Nginx Stable "
|
|
|
|
|
"version not found.")
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHP 7.2
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.php:
|
|
|
|
|
Log.debug(self, "Removing apt_packages variable of PHP")
|
2019-03-27 12:49:17 +01:00
|
|
|
if WOAptGet.is_installed(self, 'php7.2-fpm'):
|
|
|
|
|
if not WOAptGet.is_installed(self, 'php7.3-fpm'):
|
2019-04-01 20:59:53 +02:00
|
|
|
apt_packages = apt_packages + WOVariables.wo_php + \
|
|
|
|
|
WOVariables.wo_php_extra
|
2019-03-27 12:49:17 +01:00
|
|
|
else:
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_php
|
|
|
|
|
else:
|
|
|
|
|
Log.error(self, "PHP 7.2 not found")
|
2018-11-13 21:55:59 +01:00
|
|
|
|
2019-03-08 00:43:25 +01:00
|
|
|
# PHP7.3
|
2019-03-02 20:38:31 +01:00
|
|
|
if self.app.pargs.php73:
|
2019-03-15 16:45:10 +01:00
|
|
|
Log.debug(self, "Removing apt_packages variable of PHP 7.3")
|
2019-03-27 12:49:17 +01:00
|
|
|
if WOAptGet.is_installed(self, 'php7.3-fpm'):
|
2019-03-16 09:18:15 +01:00
|
|
|
if not (WOAptGet.is_installed(self, 'php7.2-fpm')):
|
2019-04-01 20:59:53 +02:00
|
|
|
apt_packages = apt_packages + WOVariables.wo_php73 + \
|
2019-04-01 22:19:44 +02:00
|
|
|
WOVariables.wo_php_extra
|
2019-03-16 09:18:15 +01:00
|
|
|
else:
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_php73
|
2019-03-27 12:49:17 +01:00
|
|
|
else:
|
|
|
|
|
Log.error(self, "PHP 7.3 not found")
|
2018-11-13 21:55:59 +01:00
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# REDIS
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.redis:
|
|
|
|
|
Log.debug(self, "Remove apt_packages variable of Redis")
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_redis
|
|
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# MariaDB
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.mysql:
|
|
|
|
|
Log.debug(self, "Removing apt_packages variable of MySQL")
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_mysql
|
|
|
|
|
packages = packages + ['/usr/bin/mysqltuner']
|
2019-07-18 17:04:20 +02:00
|
|
|
|
|
|
|
|
# fail2ban
|
2019-07-18 18:19:04 +02:00
|
|
|
if self.app.pargs.fail2ban:
|
2019-07-19 13:47:29 +02:00
|
|
|
if WOAptGet.is_installed(self, 'fail2ban'):
|
|
|
|
|
Log.debug(self, "Remove apt_packages variable of Fail2ban")
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_fail2ban
|
|
|
|
|
else:
|
|
|
|
|
Log.error(self, "Fail2ban not found")
|
|
|
|
|
|
|
|
|
|
# proftpd
|
|
|
|
|
if self.app.pargs.proftpd:
|
|
|
|
|
if WOAptGet.is_installed(self, 'proftpd-basic'):
|
|
|
|
|
Log.debug(self, "Remove apt_packages variable for ProFTPd")
|
|
|
|
|
apt_packages = apt_packages + ["proftpd-basic"]
|
|
|
|
|
else:
|
|
|
|
|
Log.error(self, "ProFTPd not found")
|
2019-07-18 17:04:20 +02:00
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# WPCLI
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.wpcli:
|
|
|
|
|
Log.debug(self, "Removing package variable of WPCLI ")
|
2019-03-04 07:12:57 +01:00
|
|
|
if os.path.isfile('/usr/local/bin/wp'):
|
|
|
|
|
packages = packages + ['/usr/local/bin/wp']
|
2018-11-13 21:55:59 +01:00
|
|
|
else:
|
|
|
|
|
Log.warn(self, "WP-CLI is not installed with WordOps")
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHPMYADMIN
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.phpmyadmin:
|
|
|
|
|
Log.debug(self, "Removing package variable of phpMyAdmin ")
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/db/pma'
|
|
|
|
|
.format(WOVariables.wo_webroot)]
|
2019-07-11 14:18:13 +02:00
|
|
|
# Composer
|
|
|
|
|
if self.app.pargs.composer:
|
|
|
|
|
Log.debug(self, "Removing package variable of Composer ")
|
|
|
|
|
if os.path.isfile('/usr/local/bin/composer'):
|
|
|
|
|
packages = packages + ['/usr/local/bin/composer']
|
|
|
|
|
else:
|
|
|
|
|
Log.warn(self, "Composer is not installed with WordOps")
|
|
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHPREDISADMIN
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.phpredisadmin:
|
|
|
|
|
Log.debug(self, "Removing package variable of phpRedisAdmin ")
|
2019-07-11 21:07:01 +02:00
|
|
|
if os.path.isdir('{0}22222/htdocs/cache/redis'
|
|
|
|
|
.format(WOVariables.wo_webroot)):
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/'
|
|
|
|
|
'cache/redis/phpRedisAdmin'
|
|
|
|
|
.format(WOVariables.wo_webroot)]
|
2019-03-15 16:45:10 +01:00
|
|
|
# ADMINER
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.adminer:
|
|
|
|
|
Log.debug(self, "Removing package variable of Adminer ")
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/db/adminer'
|
|
|
|
|
.format(WOVariables.wo_webroot)]
|
|
|
|
|
if self.app.pargs.utils:
|
|
|
|
|
Log.debug(self, "Removing package variable of utils ")
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/php/webgrind/'
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
'{0}22222/htdocs/cache/opcache'
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
'{0}22222/htdocs/cache/nginx/'
|
|
|
|
|
'clean.php'.format(WOVariables.wo_webroot),
|
|
|
|
|
'/usr/bin/pt-query-advisor',
|
|
|
|
|
'{0}22222/htdocs/db/anemometer'
|
|
|
|
|
.format(WOVariables.wo_webroot)]
|
|
|
|
|
|
2019-07-11 14:18:13 +02:00
|
|
|
if self.app.pargs.netdata:
|
|
|
|
|
Log.debug(self, "Removing Netdata")
|
|
|
|
|
if os.path.isfile('/opt/netdata/usr/'
|
|
|
|
|
'libexec/netdata-uninstaller.sh'):
|
|
|
|
|
packages = packages + ['/var/lib/wo/tmp/kickstart.sh']
|
|
|
|
|
|
2019-07-11 21:07:01 +02:00
|
|
|
if self.app.pargs.dashboard:
|
|
|
|
|
Log.debug(self, "Removing Wo-Dashboard")
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/assets/'
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
'{0}22222/htdocs/index.php'
|
|
|
|
|
.format(WOVariables.wo_webroot)]
|
|
|
|
|
|
2019-04-30 18:50:30 +02:00
|
|
|
if (packages) or (apt_packages):
|
2018-11-13 21:55:59 +01:00
|
|
|
wo_prompt = input('Are you sure you to want to'
|
|
|
|
|
' remove from server.'
|
|
|
|
|
'\nPackage configuration will remain'
|
|
|
|
|
' on server after this operation.\n'
|
|
|
|
|
'Any answer other than '
|
|
|
|
|
'"yes" will be stop this'
|
|
|
|
|
' operation : ')
|
|
|
|
|
|
|
|
|
|
if wo_prompt == 'YES' or wo_prompt == 'yes':
|
|
|
|
|
|
2019-03-02 20:38:31 +01:00
|
|
|
if (set(["nginx-custom"]).issubset(set(apt_packages))):
|
2018-11-13 21:55:59 +01:00
|
|
|
WOService.stop_service(self, 'nginx')
|
|
|
|
|
|
2019-07-11 14:18:13 +02:00
|
|
|
# Netdata uninstaller
|
|
|
|
|
if (set(['/var/lib/wo/tmp/'
|
|
|
|
|
'kickstart.sh']).issubset(set(packages))):
|
|
|
|
|
WOShellExec.cmd_exec(self, "bash /opt/netdata/usr/"
|
|
|
|
|
"libexec/netdata-"
|
|
|
|
|
"uninstaller.sh -y -f")
|
|
|
|
|
|
2019-04-30 18:50:30 +02:00
|
|
|
if (packages):
|
2018-11-13 21:55:59 +01:00
|
|
|
WOFileUtils.remove(self, packages)
|
|
|
|
|
WOAptGet.auto_remove(self)
|
|
|
|
|
|
2019-04-30 18:50:30 +02:00
|
|
|
if (apt_packages):
|
2018-11-13 21:55:59 +01:00
|
|
|
Log.debug(self, "Removing apt_packages")
|
|
|
|
|
Log.info(self, "Removing packages, please wait...")
|
|
|
|
|
WOAptGet.remove(self, apt_packages)
|
|
|
|
|
WOAptGet.auto_remove(self)
|
|
|
|
|
|
|
|
|
|
Log.info(self, "Successfully removed packages")
|
|
|
|
|
|
|
|
|
|
@expose(help="Purge packages")
|
|
|
|
|
def purge(self):
|
|
|
|
|
"""Start purging of packages"""
|
|
|
|
|
apt_packages = []
|
|
|
|
|
packages = []
|
|
|
|
|
|
|
|
|
|
# Default action for stack purge
|
|
|
|
|
if ((not self.app.pargs.web) and (not self.app.pargs.admin) and
|
2019-03-02 20:38:31 +01:00
|
|
|
(not self.app.pargs.nginx) and (not self.app.pargs.php) and
|
|
|
|
|
(not self.app.pargs.php73) and (not self.app.pargs.mysql) and
|
|
|
|
|
(not self.app.pargs.wpcli) and (not self.app.pargs.phpmyadmin) and
|
2019-03-13 05:02:53 +01:00
|
|
|
(not self.app.pargs.adminer) and (not self.app.pargs.utils) and
|
2019-04-03 06:59:13 +02:00
|
|
|
(not self.app.pargs.composer) and (not self.app.pargs.netdata) and
|
2019-07-19 15:21:17 +02:00
|
|
|
(not self.app.pargs.fail2ban) and (not self.app.pargs.proftpd) and
|
|
|
|
|
(not self.app.pargs.security) and
|
2019-03-13 05:02:53 +01:00
|
|
|
(not self.app.pargs.all) and (not self.app.pargs.redis) and
|
2019-03-15 16:45:10 +01:00
|
|
|
(not self.app.pargs.phpredisadmin)):
|
2018-11-13 21:55:59 +01:00
|
|
|
self.app.pargs.web = True
|
|
|
|
|
self.app.pargs.admin = True
|
2019-07-19 15:21:17 +02:00
|
|
|
self.app.pargs.security = True
|
2018-11-13 21:55:59 +01:00
|
|
|
|
|
|
|
|
if self.app.pargs.all:
|
|
|
|
|
self.app.pargs.web = True
|
|
|
|
|
self.app.pargs.admin = True
|
2019-03-15 16:45:10 +01:00
|
|
|
self.app.pargs.php73 = True
|
2018-11-13 21:55:59 +01:00
|
|
|
|
|
|
|
|
if self.app.pargs.web:
|
|
|
|
|
self.app.pargs.nginx = True
|
|
|
|
|
self.app.pargs.php = True
|
|
|
|
|
self.app.pargs.mysql = True
|
|
|
|
|
self.app.pargs.wpcli = True
|
|
|
|
|
|
|
|
|
|
if self.app.pargs.admin:
|
|
|
|
|
self.app.pargs.adminer = True
|
|
|
|
|
self.app.pargs.phpmyadmin = True
|
|
|
|
|
self.app.pargs.utils = True
|
2019-07-11 14:18:13 +02:00
|
|
|
self.app.pargs.composer = True
|
|
|
|
|
self.app.pargs.netdata = True
|
2019-07-11 21:07:01 +02:00
|
|
|
self.app.pargs.dashboard = True
|
|
|
|
|
self.app.pargs.phpredisadmin = True
|
2018-11-13 21:55:59 +01:00
|
|
|
|
2019-07-19 15:21:17 +02:00
|
|
|
if self.app.pargs.security:
|
|
|
|
|
self.app.pargs.fail2ban = True
|
2019-03-15 16:45:10 +01:00
|
|
|
# NGINX
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.nginx:
|
|
|
|
|
if WOAptGet.is_installed(self, 'nginx-custom'):
|
|
|
|
|
Log.debug(self, "Purge apt_packages variable of Nginx")
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_nginx
|
|
|
|
|
else:
|
2019-04-23 19:03:42 +02:00
|
|
|
Log.error(self, "Cannot Purge! "
|
|
|
|
|
"Nginx Stable version not found.")
|
2019-03-15 16:45:10 +01:00
|
|
|
|
|
|
|
|
# PHP
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.php:
|
|
|
|
|
Log.debug(self, "Purge apt_packages variable PHP")
|
2019-03-27 12:49:17 +01:00
|
|
|
if WOAptGet.is_installed(self, 'php7.2-fpm'):
|
|
|
|
|
if not (WOAptGet.is_installed(self, 'php7.3-fpm')):
|
2019-04-11 20:35:03 +02:00
|
|
|
apt_packages = apt_packages + WOVariables.wo_php + \
|
|
|
|
|
WOVariables.wo_php_extra
|
2019-03-27 12:49:17 +01:00
|
|
|
else:
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_php
|
2018-11-13 21:55:59 +01:00
|
|
|
else:
|
2019-03-15 16:45:10 +01:00
|
|
|
Log.error(self, "Cannot Purge PHP 7.2. not found.")
|
2018-11-13 21:55:59 +01:00
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHP 7.3
|
2019-03-02 20:38:31 +01:00
|
|
|
if self.app.pargs.php73:
|
2019-03-15 16:45:10 +01:00
|
|
|
Log.debug(self, "Removing apt_packages variable of PHP 7.3")
|
2019-03-27 12:49:17 +01:00
|
|
|
if WOAptGet.is_installed(self, 'php7.3-fpm'):
|
2019-03-16 09:18:15 +01:00
|
|
|
if not (WOAptGet.is_installed(self, 'php7.2-fpm')):
|
2019-04-11 20:35:03 +02:00
|
|
|
apt_packages = apt_packages + WOVariables.wo_php73 + \
|
|
|
|
|
WOVariables.wo_php_extra
|
2019-03-16 09:18:15 +01:00
|
|
|
else:
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_php73
|
2019-03-27 12:49:17 +01:00
|
|
|
|
2019-07-18 17:04:20 +02:00
|
|
|
# fail2ban
|
2019-07-18 18:19:04 +02:00
|
|
|
if self.app.pargs.fail2ban:
|
2019-07-19 13:47:29 +02:00
|
|
|
if WOAptGet.is_installed(self, 'fail2ban'):
|
|
|
|
|
Log.debug(self, "Purge apt_packages variable of Fail2ban")
|
|
|
|
|
apt_packages = apt_packages + WOVariables.wo_fail2ban
|
|
|
|
|
|
|
|
|
|
# proftpd
|
|
|
|
|
if self.app.pargs.proftpd:
|
|
|
|
|
if WOAptGet.is_installed(self, 'proftpd-basic'):
|
|
|
|
|
Log.debug(self, "Purge apt_packages variable for ProFTPd")
|
|
|
|
|
apt_packages = apt_packages + ["proftpd-basic"]
|
2019-07-18 17:04:20 +02:00
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# WP-CLI
|
|
|
|
|
if self.app.pargs.wpcli:
|
2018-11-13 21:55:59 +01:00
|
|
|
Log.debug(self, "Purge package variable WPCLI")
|
2019-03-04 07:12:57 +01:00
|
|
|
if os.path.isfile('/usr/local/bin/wp'):
|
|
|
|
|
packages = packages + ['/usr/local/bin/wp']
|
2018-11-13 21:55:59 +01:00
|
|
|
else:
|
|
|
|
|
Log.warn(self, "WP-CLI is not installed with WordOps")
|
2019-03-15 16:45:10 +01:00
|
|
|
|
|
|
|
|
# PHPMYADMIN
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.phpmyadmin:
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/db/pma'.
|
|
|
|
|
format(WOVariables.wo_webroot)]
|
|
|
|
|
Log.debug(self, "Purge package variable phpMyAdmin")
|
2019-03-15 16:45:10 +01:00
|
|
|
|
2019-07-11 14:18:13 +02:00
|
|
|
# Composer
|
|
|
|
|
if self.app.pargs.composer:
|
|
|
|
|
Log.debug(self, "Removing package variable of Composer ")
|
|
|
|
|
if os.path.isfile('/usr/local/bin/composer'):
|
|
|
|
|
packages = packages + ['/usr/local/bin/composer']
|
|
|
|
|
else:
|
|
|
|
|
Log.warn(self, "Composer is not installed with WordOps")
|
|
|
|
|
|
2019-03-15 16:45:10 +01:00
|
|
|
# PHPREDISADMIN
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.phpredisadmin:
|
|
|
|
|
Log.debug(self, "Removing package variable of phpRedisAdmin ")
|
2019-07-11 21:07:01 +02:00
|
|
|
if os.path.isdir('{0}22222/htdocs/cache/redis'
|
|
|
|
|
.format(WOVariables.wo_webroot)):
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/'
|
|
|
|
|
'cache/redis/phpRedisAdmin'
|
|
|
|
|
.format(WOVariables.wo_webroot)]
|
2019-03-15 16:45:10 +01:00
|
|
|
# Adminer
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.adminer:
|
|
|
|
|
Log.debug(self, "Purge package variable Adminer")
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/db/adminer'
|
|
|
|
|
.format(WOVariables.wo_webroot)]
|
2019-03-15 16:45:10 +01:00
|
|
|
# utils
|
2018-11-13 21:55:59 +01:00
|
|
|
if self.app.pargs.utils:
|
|
|
|
|
Log.debug(self, "Purge package variable utils")
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/php/webgrind/'
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
'{0}22222/htdocs/cache/opcache'
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
'{0}22222/htdocs/cache/nginx/'
|
|
|
|
|
'clean.php'.format(WOVariables.wo_webroot),
|
|
|
|
|
'/usr/bin/pt-query-advisor',
|
|
|
|
|
'{0}22222/htdocs/db/anemometer'
|
|
|
|
|
.format(WOVariables.wo_webroot)
|
|
|
|
|
]
|
|
|
|
|
|
2019-07-11 14:18:13 +02:00
|
|
|
if self.app.pargs.netdata:
|
|
|
|
|
Log.debug(self, "Removing Netdata")
|
|
|
|
|
if os.path.isfile('/opt/netdata/usr/'
|
|
|
|
|
'libexec/netdata-uninstaller.sh'):
|
|
|
|
|
packages = packages + ['/var/lib/wo/tmp/kickstart.sh']
|
|
|
|
|
|
2019-07-11 21:07:01 +02:00
|
|
|
if self.app.pargs.dashboard:
|
|
|
|
|
Log.debug(self, "Removing Wo-Dashboard")
|
|
|
|
|
packages = packages + ['{0}22222/htdocs/assets/'
|
|
|
|
|
.format(WOVariables.wo_webroot),
|
|
|
|
|
'{0}22222/htdocs/index.php'
|
|
|
|
|
.format(WOVariables.wo_webroot)]
|
|
|
|
|
|
2019-04-30 18:50:30 +02:00
|
|
|
if (packages) or (apt_packages):
|
2018-11-13 21:55:59 +01:00
|
|
|
wo_prompt = input('Are you sure you to want to purge '
|
|
|
|
|
'from server '
|
|
|
|
|
'along with their configuration'
|
|
|
|
|
' packages,\nAny answer other than '
|
|
|
|
|
'"yes" will be stop this '
|
|
|
|
|
'operation :')
|
|
|
|
|
|
|
|
|
|
if wo_prompt == 'YES' or wo_prompt == 'yes':
|
|
|
|
|
|
2019-03-02 20:38:31 +01:00
|
|
|
if (set(["nginx-custom"]).issubset(set(apt_packages))):
|
2018-11-13 21:55:59 +01:00
|
|
|
WOService.stop_service(self, 'nginx')
|
|
|
|
|
|
2019-07-11 14:18:13 +02:00
|
|
|
# Netdata uninstaller
|
|
|
|
|
if (set(['/var/lib/wo/tmp/'
|
|
|
|
|
'kickstart.sh']).issubset(set(packages))):
|
|
|
|
|
WOShellExec.cmd_exec(self, "bash /opt/netdata/usr/"
|
|
|
|
|
"libexec/netdata-"
|
|
|
|
|
"uninstaller.sh -y -f")
|
|
|
|
|
|
2019-07-18 19:14:24 +02:00
|
|
|
if (set(["fail2ban"]).issubset(set(apt_packages))):
|
|
|
|
|
WOService.stop_service(self, 'fail2ban')
|
|
|
|
|
|
2019-04-30 18:50:30 +02:00
|
|
|
if (apt_packages):
|
2018-11-13 21:55:59 +01:00
|
|
|
Log.info(self, "Purging packages, please wait...")
|
|
|
|
|
WOAptGet.remove(self, apt_packages, purge=True)
|
|
|
|
|
WOAptGet.auto_remove(self)
|
|
|
|
|
|
2019-04-30 18:50:30 +02:00
|
|
|
if (packages):
|
2018-11-13 21:55:59 +01:00
|
|
|
WOFileUtils.remove(self, packages)
|
|
|
|
|
WOAptGet.auto_remove(self)
|
|
|
|
|
|
|
|
|
|
Log.info(self, "Successfully purged packages")
|
|
|
|
|
|
2019-03-07 18:38:19 +01:00
|
|
|
|
2018-11-13 21:55:59 +01:00
|
|
|
def load(app):
|
|
|
|
|
# register the plugin class.. this only happens if the plugin is enabled
|
|
|
|
|
handler.register(WOStackController)
|
|
|
|
|
handler.register(WOStackStatusController)
|
|
|
|
|
handler.register(WOStackMigrateController)
|
|
|
|
|
handler.register(WOStackUpgradeController)
|
|
|
|
|
|
|
|
|
|
# register a hook (function) to run after arguments are parsed.
|
2019-03-02 20:38:31 +01:00
|
|
|
hook.register('post_argument_parsing', wo_stack_hook)
|