Refactored
This commit is contained in:
66
.gitignore
vendored
Normal file
66
.gitignore
vendored
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
env/
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
|
||||||
|
# Vim .swp file
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# Folder created for Nose testing
|
||||||
|
bin/
|
||||||
|
coverage_report/
|
||||||
|
include/
|
||||||
|
local/
|
||||||
|
man/
|
||||||
100
.travis.yml
Normal file
100
.travis.yml
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
language: bash
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- rm -rf ~/.gnupg
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- sudo rm -rf /etc/mysql/
|
||||||
|
- sudo bash -c 'echo example.com > /etc/hostname'
|
||||||
|
- sudo service hostname restart
|
||||||
|
- sudo apt-get -qq purge mysql* graphviz*
|
||||||
|
- sudo apt-get -qq autoremove
|
||||||
|
- sudo apt-get update
|
||||||
|
|
||||||
|
script:
|
||||||
|
- lsb_release -a
|
||||||
|
- unset LANG
|
||||||
|
- sudo bash -c 'echo -e "[user]\n\tname = abc\n\temail = root@localhost.com" > /home/travis/.gitconfig'
|
||||||
|
- sudo echo "Travis Banch = $TRAVIS_BRANCH"
|
||||||
|
- sudo apt-get install -y --force-yes git python3-setuptools python3-dev python3-apt
|
||||||
|
- sudo bash install $TRAVIS_BRANCH
|
||||||
|
- sudo wo --help
|
||||||
|
- sudo wo stack install || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo stack install --web || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo stack install --admin || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site create html.net --html || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create php.com --php || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create mysql.com --mysql || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site1.com --wp || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site create site2.net --wp --wpsc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site4.com --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site4.net --wp --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site4.org --wpfc --wp || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site5.com --wpsubdir || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site create site6.com --wpsubdir --wpsc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site8.com --wpsubdir --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site8.net --wpfc --wpsubdir || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site9.com --wpsubdomain || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site create site10.org --wpsubdomain --wpsc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site12.org --wpsubdomain --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site12.in --wpfc --wpsubdomain || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- yes | sudo wo site create site.hhvm.pagespeed2.com --wpsc --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site.hhvm.pagespeed4.com --wpfc --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site.hhvm.pagespeed5.com --wpsubdir --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site.hhvm.pagespeed6.com --wpsubdir --wpsc --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site.hhvm.pagespeed8.com --wpsubdir --wpfc --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site.hhvm.pagespeed9.com --wpsubdomain --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site.hhvm.pagespeed10.org --wpsubdomain --wpsc --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site.hhvm.pagespeed12.in --wpfc --wpsubdomain --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site create site1.localtest.me --php --mysql || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site2.localtest.me --mysql --html || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site3.localtest.me --php --html || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site4.localtest.me --wp --wpsubdomain || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create site5.localtest.me --wp --wpsubdir --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site6.localtest.me --wpredis || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site7.localtest.me --wpsubdomain --wpredis || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site create site8.localtest.me --wpsubdir --wpredis || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
|
||||||
|
- sudo wo debug --all || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo debug --all=off || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo debug site12.net || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo debug site12.net --all=off || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create 1.com --html || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create 2.com --php || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create 3.com --mysql || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site update 1.com --wp || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site update 2.com --wpsubdir || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site update 3.com --wpsubdomain || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site update site1.com --wp --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site update site1.com --wp --wpsc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site update site1.com --wpredis || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site update site5.com --wpsubdir --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site update site5.com --wpsubdir --wpsc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site update site9.com --wpsubdomain --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site update site9.com --wpsubdomain --wpsc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site update site.hhvm.pagespeed12.in --hhvm=off || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- yes | sudo wo site update site9.com --hhvm || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site info site.hhvm.pagespeed12.in || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site info site9.com || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site create www.site-1.com --wp || sudo tail -n50 /var/log/wo/wordops.log|| sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site create www.subsite.site-1.com --wpfc || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site update www.subsite.site-1.com --wp || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
- sudo wo site delete www.subsite.site-1.com --all --no-prompt || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo wo site delete site12.in --all --no-prompt || sudo tail -n50 /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
- sudo ls /var/www/
|
||||||
|
- sudo wp --allow-root --info
|
||||||
|
- sudo bash -c 'cat /var/log/wo/wordops.log'
|
||||||
8
CHANGELOG.txt
Normal file
8
CHANGELOG.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
v3.9.0 - November 11, 2018
|
||||||
|
|
||||||
|
[+] Rebranded the fork to WordOps
|
||||||
|
[+] Codebase cleanup
|
||||||
|
[+] Included support for newer OS releases
|
||||||
|
[+] Reworked the HTTPS configuration
|
||||||
|
[-] Dropped mail services
|
||||||
|
[-] Dropped w3tc support
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2018 WordOps
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
93
README.md
Normal file
93
README.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# [WordOps](https://wordops.org/)
|
||||||
|
|
||||||
|
WordOps (wo) is the essential toolset that eases WordPress site and server administration.
|
||||||
|
|
||||||
|
**WordOps currently supports:**
|
||||||
|
|
||||||
|
- Ubuntu 14.04, 16.04 & 18.04
|
||||||
|
- Debian 7, 8 & 9
|
||||||
|
|
||||||
|
**Port requirements:**
|
||||||
|
|
||||||
|
| Name | Port Number | Inbound | Outbound |
|
||||||
|
|:-----:|:-----------:|:-------:|:---------:|
|
||||||
|
|SSH |22 | ✓ |✓ |
|
||||||
|
|HTTP |80 | ✓ |✓ |
|
||||||
|
|HTTPS/SSL |443 | ✓ |✓ |
|
||||||
|
|WO Admin |22222 | ✓ | |
|
||||||
|
|GPG Key Server |11371 | |✓ |
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget -qO wo wordops.se/tup && sudo bash wo # Install WordOps
|
||||||
|
sudo wo site create example.com --wp # Install required packages & setup WordPress on example.com
|
||||||
|
```
|
||||||
|
## Must read!
|
||||||
|
|
||||||
|
WordOps made some fundamental changes:
|
||||||
|
|
||||||
|
* We've deprecated the mail stack. Less is more. As an alternative, take a look at [iRedMail](https://www.iredmail.org/) or [Caesonia](https://github.com/vedetta-com/caesonia). And an alternative for Roundcube is [Rainloop](https://www.rainloop.net/).
|
||||||
|
* Support for w3tc is dropped as a security precaution.
|
||||||
|
* We are currently migrating the PHP 5.x series to PHP 7.1 and PHP 7.2. We'll offer an easy to use migration script once we are confident enough to unleash this daemon.
|
||||||
|
|
||||||
|
## Update WordOps
|
||||||
|
|
||||||
|
#### With one simple command
|
||||||
|
```
|
||||||
|
wo update
|
||||||
|
```
|
||||||
|
|
||||||
|
## More site creation commands
|
||||||
|
|
||||||
|
### Standard WordPress sites
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wo site create example.com --wp # install wordpress without any page caching
|
||||||
|
wo site create example.com --wpsc # install wordpress with wp-super-cache plugin
|
||||||
|
wo site create example.com --wpfc # install wordpress + nginx fastcgi_cache
|
||||||
|
wo site create example.com --wpredis # install wordpress + nginx redis_cache
|
||||||
|
```
|
||||||
|
|
||||||
|
### WordPress multsite with subdirectory
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wo site create example.com --wpsubdir # install wpmu-subdirectory without any page caching
|
||||||
|
wo site create example.com --wpsubdir --wpsc # install wpmu-subdirectory with wp-super-cache plugin
|
||||||
|
wo site create example.com --wpsubdir --wpfc # install wpmu-subdirectory + nginx fastcgi_cache
|
||||||
|
wo site create example.com --wpsubdir --wpredis # install wpmu-subdirectory + nginx redis_cache
|
||||||
|
```
|
||||||
|
|
||||||
|
### WordPress multsite with subdomain
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wo site create example.com --wpsubdomain # install wpmu-subdomain without any page caching
|
||||||
|
wo site create example.com --wpsubdomain --wpsc # install wpmu-subdomain with wp-super-cache plugin
|
||||||
|
wo site create example.com --wpsubdomain --wpfc # install wpmu-subdomain + nginx fastcgi_cache
|
||||||
|
wo site create example.com --wpsubdomain --wpredis # install wpmu-subdomain + nginx redis_cache
|
||||||
|
```
|
||||||
|
|
||||||
|
### Non-WordPress sites
|
||||||
|
```bash
|
||||||
|
wo site create example.com --html # create example.com for static/html sites
|
||||||
|
wo site create example.com --php # create example.com with php support
|
||||||
|
wo site create example.com --mysql # create example.com with php & mysql support
|
||||||
|
```
|
||||||
|
|
||||||
|
### HHVM enabled sites
|
||||||
|
```bash
|
||||||
|
wo site create example.com --wp --hhvm # create example.com WordPress site with HHVM support
|
||||||
|
wo site create example.com --php --hhvm # create example.com php site with HHVM support
|
||||||
|
```
|
||||||
|
|
||||||
|
## Cheatsheet - site creation
|
||||||
|
|
||||||
|
| | single site | multisite w/ subdir | multisite w/ subdom |
|
||||||
|
|--------------------|---------------|-----------------------|--------------------------|
|
||||||
|
| **NO Cache** | --wp | --wpsubdir | --wpsubdomain |
|
||||||
|
| **WP Super Cache** | --wpsc | --wpsubdir --wpsc | --wpsubdomain --wpsc |
|
||||||
|
| **Nginx cache** | --wpfc | --wpsubdir --wpfc | --wpsubdomain --wpfc |
|
||||||
|
| **Redis cache** | --wpredis | --wpsubdir --wpredis | --wpsubdomain --wpredis |
|
||||||
|
|
||||||
|
## License
|
||||||
|
[MIT](http://opensource.org/licenses/MIT)
|
||||||
378
config/bash_completion.d/wo_auto.rc
Normal file
378
config/bash_completion.d/wo_auto.rc
Normal file
@@ -0,0 +1,378 @@
|
|||||||
|
_wo_complete()
|
||||||
|
{
|
||||||
|
local cur prev BASE_LEVEL
|
||||||
|
|
||||||
|
COMPREPLY=()
|
||||||
|
cur=${COMP_WORDS[COMP_CWORD]}
|
||||||
|
prev=${COMP_WORDS[COMP_CWORD-1]}
|
||||||
|
mprev=${COMP_WORDS[COMP_CWORD-2]}
|
||||||
|
|
||||||
|
|
||||||
|
# SETUP THE BASE LEVEL (everything after "wo")
|
||||||
|
if [ $COMP_CWORD -eq 1 ]; then
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "stack site debug clean secure import-slow-log log update sync info --version --help --quiet" \
|
||||||
|
-- $cur) )
|
||||||
|
|
||||||
|
|
||||||
|
# SETUP THE SECOND LEVEL (EVERYTHING AFTER "wo second")
|
||||||
|
elif [ $COMP_CWORD -eq 2 ]; then
|
||||||
|
case "$prev" in
|
||||||
|
|
||||||
|
# HANDLE EVERYTHING AFTER THE SECOND LEVEL NAMESPACE
|
||||||
|
"clean")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--memcache --opcache --fastcgi --redis --all" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
# IF YOU HAD ANOTHER CONTROLLER, YOU'D HANDLE THAT HERE
|
||||||
|
"debug")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(command find /etc/nginx/sites-enabled/ -type l -printf "%P " 2> /dev/null) --nginx --php --php7 --fpm --fpm7 --mysql -i --interactive --all --import-slow-log --import-slow-log-interval= --nginx=off --php=off --php7=off --fpm=off --fpm7=off --mysql=off --all=off " \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"stack")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "upgrade install purge reload remove restart start status stop migrate" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"site")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "cd create delete disable edit enable info list log show update" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"secure")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--auth --port --ip" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"info")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--mysql --php --php7 --nginx" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"log")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "show reset gzip mail" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
# EVERYTHING ELSE
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# SETUP THE THIRD LEVEL (EVERYTHING AFTER "wo second third")
|
||||||
|
elif [ $COMP_CWORD -eq 3 ]; then
|
||||||
|
case "$prev" in
|
||||||
|
# HANDLE EVERYTHING AFTER THE THIRD LEVEL NAMESPACE
|
||||||
|
"install" | "purge" | "remove" )
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--web --admin --nginx --php --php7 --mysql --wpcli --phpmyadmin --adminer --utils --all --hhvm --redis --phpredisadmin" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"upgrade" )
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--web --nginx --php --php7 --mysql --all --hhvm --php56 --no-prompt --wpcli" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"start" | "stop" | "reload" | "restart" | "status")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--nginx --php --php7 --mysql --memcache --redis" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"migrate")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--mariadb" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"list")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--enabled --disabled" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"edit" | "enable" | "info" | "log" | "show" | "cd" | "delete")
|
||||||
|
if [ ${COMP_WORDS[1]} == "log" ]; then
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(find /etc/nginx/sites-available/ -type f -printf "%P " 2> /dev/null) --nginx --php --fpm --mysql --access" \
|
||||||
|
-- $cur) )
|
||||||
|
else
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(find /etc/nginx/sites-available/ -type f -printf "%P " 2> /dev/null)" \
|
||||||
|
-- $cur) )
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"update")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(find /etc/nginx/sites-available/ -type f -printf "%P " 2> /dev/null) --all" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"gzip")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(find /etc/nginx/sites-available/ -type f -printf "%P " 2> /dev/null) --nginx --php --fpm --mysql --access" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"reset")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(find /etc/nginx/sites-available/ -type f -printf "%P " 2> /dev/null) --nginx --php --fpm --mysql --wp --access --slow-log-db" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"disable")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(command find /etc/nginx/sites-enabled/ -type l -printf "%P " 2> /dev/null)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ ${COMP_WORDS[1]} == "debug" ] && ([ "$prev" != "--start" ] && [ "$prev" != "--nginx" ] && [ "$prev" != "--php" ] && [ "$prev" != "--php7" ] && [ "$prev" != "--fpm" ] && [ "$prev" != "--fpm7" ] && [ "$prev" != "--mysql" ] && [ "$prev" != "-i" ] && [ "$prev" != "--interactive" ] && [ "$prev" != "--import-slow-log" ] && [ "$prev" != "--stop" ]); then
|
||||||
|
retlist="--all --wp --rewrite -i --all=off --wp=off --rewrite=off"
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
fi
|
||||||
|
|
||||||
|
#if [ ${COMP_WORDS[1]} == "log" ] && ([ "$prev" != "--access" ] || [ "$prev" != "--nginx" ] || [ "$prev" != "--php" ] || [ "$prev" != "--fpm" ] || [ "$prev" != "--mysql" ] || [ "$prev" != "-i" ] || ["$prev" != "--interactive" ] || ["$prev" != "--stop" ]); then
|
||||||
|
# retlist="--all --wp --rewrite -i --all=off --wp=off --rewrite=off"
|
||||||
|
# ret="${retlist[@]/$prev}"
|
||||||
|
# COMPREPLY=( $(compgen \
|
||||||
|
# -W "$(echo $ret)" \
|
||||||
|
# -- $cur) )
|
||||||
|
#fi
|
||||||
|
|
||||||
|
|
||||||
|
elif [ $COMP_CWORD -eq 4 ]; then
|
||||||
|
case "$mprev" in
|
||||||
|
# HANDLE EVERYTHING AFTER THE THIRD LEVEL NAMESPACE
|
||||||
|
|
||||||
|
"create")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--user --pass --email --html --php --php7 --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --hhvm --proxy= --wpredis --letsencrypt -le" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"update")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--password --php --php7 --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --hhvm --hhvm=off --wpredis --letsencrypt --letsencrypt=off --letsencrypt=renew" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"delete")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--db --files --all --no-prompt --force -f" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"show")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--wp --nginx --php --fpm --mysql --access" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"gzip")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--wp --nginx --php --fpm --mysql --access" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"mail")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--wp --nginx --php --fpm --mysql --access --to=" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"reset")
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "--wp --nginx --php --fpm --mysql --wp --access --slow-log-db" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
edit)
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$prev" in
|
||||||
|
"--wp")
|
||||||
|
if [ ${COMP_WORDS[1]} != "debug" ]; then
|
||||||
|
if [ ${COMP_WORDS[2]} == "create" ]; then
|
||||||
|
retlist="--wp --wpsc --wpfc --hhvm --user --email --pass --wpredis --letsencrypt --php7"
|
||||||
|
elif [ ${COMP_WORDS[2]} == "update" ]; then
|
||||||
|
retlist="--wp --wpfc --wpsc --php7 --php7=off --hhvm --hhvm=off --wpredis --letsencrypt --letsencrypt=off --letsencrypt=renew"
|
||||||
|
else
|
||||||
|
retlist=""
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
retlist="--wp --wp=off --rewrite --rewrite=off -i --interactive"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"--wpsubdir" | "--wpsubdomain")
|
||||||
|
if [ ${COMP_WORDS[1]} != "debug" ]; then
|
||||||
|
if [ ${COMP_WORDS[2]} == "create" ]; then
|
||||||
|
retlist="--wpsc --wpfc --hhvm --user --email --pass --wpredis --letsencrypt --php7"
|
||||||
|
elif [ ${COMP_WORDS[2]} == "update" ]; then
|
||||||
|
retlist="--wpfc --wpsc --php7 --php7=off --hhvm --hhvm=off --wpredis --letsencrypt --letsencrypt=off --letsencrypt=renew"
|
||||||
|
else
|
||||||
|
retlist=""
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
retlist="--wp=off --rewrite --rewrite=off -i --interactive"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"--hhvm" | "--wpredis" | "--wpfc" | "--wpsc" | "--wpsubdir" | "--wpsubdomain" | "--user" | "--pass" | "--email" | "--wp")
|
||||||
|
if [ ${COMP_WORDS[2]} == "create" ]; then
|
||||||
|
retlist="--user --pass --email --wp --wpsubdir --wpsubdomain --wpfc --wpsc --hhvm --experimenal --wpredis --php7 --letsencrypt "
|
||||||
|
else
|
||||||
|
retlist=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"--hhvm" | "--wpredis" | "--wpfc")
|
||||||
|
if [ ${COMP_WORDS[2]} == "update" ]; then
|
||||||
|
retlist="--password --php --php7 --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --hhvm --hhvm=off --experimenal --wpredis --letsencrypt --letsencrypt=off --letsencrypt=renew"
|
||||||
|
else
|
||||||
|
retlist=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"--web" | "--admin" | "--nginx" | "--php" | "--php7" | "--mysql" | "--wpcli" | "--phpmyadmin" | "--adminer" | "--utils" | "--memcache" | "--redis | --phpredisadmin")
|
||||||
|
if [[ ${COMP_WORDS[2]} == "install" || ${COMP_WORDS[2]} == "purge" || ${COMP_WORDS[2]} == "remove" ]]; then
|
||||||
|
retlist="--web --admin --nginx --php --php7 --mysql--wpcli --phpmyadmin --adminer --utils --memcache --redis --phpredisadmin"
|
||||||
|
elif [[ ${COMP_WORDS[2]} == "start" || ${COMP_WORDS[2]} == "reload" || ${COMP_WORDS[2]} == "restart" || ${COMP_WORDS[2]} == "stop" ]]; then
|
||||||
|
retlist="--nginx --php --php7 --mysql --memcache --redis"
|
||||||
|
elif [[ ${COMP_WORDS[1]} == "debug" ]]; then
|
||||||
|
retlist="--start --nginx --php --php7 --fpm --fpm7 --mysql -i --interactive -stop --import-slow-log --import-slow-log-interval= -"
|
||||||
|
if [[ $prev == '--mysql' ]]; then
|
||||||
|
retlist="--start --nginx --php --php7 --fpm --fpm7 --mysql -i --interactive --stop --import-slow-log"
|
||||||
|
fi
|
||||||
|
elif [[ ${COMP_WORDS[1]} == "log" ]]; then
|
||||||
|
if [ ${COMP_WORDS[2]} == "show" ]; then
|
||||||
|
retlist="--access --nginx --php --mysql --fpm --wp"
|
||||||
|
|
||||||
|
elif [ ${COMP_WORDS[2]} == "reset" ]; then
|
||||||
|
retlist="--access --nginx --php --mysql --fpm --wp --slow-log-db"
|
||||||
|
|
||||||
|
elif [ ${COMP_WORDS[2]} == "mail" ]; then
|
||||||
|
retlist="--access --nginx --php --mysql --fpm --wp --to="
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"--db" | "--files" | "--force")
|
||||||
|
retlist="--db --files --all --force"
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"--all")
|
||||||
|
if [ ${COMP_WORDS[1]} == "clean" ]; then
|
||||||
|
retlist="--memcache --opcache --fastcgi --redis"
|
||||||
|
elif [ ${COMP_WORDS[2]} == "delete" ]; then
|
||||||
|
retlist="--db --files --force"
|
||||||
|
elif [ ${COMP_WORDS[2]} == "update" ]; then
|
||||||
|
retlist="--password --php --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --hhvm --hhvm=off --wpredis --letsencrypt --letsencrypt=off --letsencrypt=renew"
|
||||||
|
else
|
||||||
|
retlist=""
|
||||||
|
fi
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
|
||||||
|
"--memcache" | "--opcache" | "--fastcgi" | "--all" | "--redis")
|
||||||
|
retlist="--memcache --opcache --fastcgi --redis --all"
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"--auth" | "--port" | "--ip")
|
||||||
|
retlist="--auth --port --ip"
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
"--access" | "--fpm" | "--wp" | "--slow-log-db")
|
||||||
|
if [[ ${COMP_WORDS[1]} == "log" ]]; then
|
||||||
|
if [ ${COMP_WORDS[2]} == "show" ]; then
|
||||||
|
retlist="--access --nginx --php --mysql --fpm --wp"
|
||||||
|
|
||||||
|
elif [ ${COMP_WORDS[2]} == "reset" ]; then
|
||||||
|
retlist="--access --nginx --php --mysql --fpm --wp --slow-log-db"
|
||||||
|
|
||||||
|
|
||||||
|
elif [ ${COMP_WORDS[2]} == "mail" ]; then
|
||||||
|
retlist="--access --nginx --php --mysql --fpm --wp --to="
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case "$mprev" in
|
||||||
|
"--user" | "--email" | "--pass")
|
||||||
|
if [ ${COMP_WORDS[2]} == "create" ]; then
|
||||||
|
retlist="--user --pass --email --html --php --php7 --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --hhvm --wpredis --letsencrypt"
|
||||||
|
fi
|
||||||
|
ret="${retlist[@]/$prev}"
|
||||||
|
COMPREPLY=( $(compgen \
|
||||||
|
-W "$(echo $ret)" \
|
||||||
|
-- $cur) )
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
} &&
|
||||||
|
complete -F _wo_complete wo
|
||||||
8
config/plugins.d/clean.conf
Normal file
8
config/plugins.d/clean.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[clean]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
8
config/plugins.d/debug.conf
Normal file
8
config/plugins.d/debug.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[debug]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
8
config/plugins.d/import_slow_log.conf
Normal file
8
config/plugins.d/import_slow_log.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[import_slow_log]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
11
config/plugins.d/info.conf
Normal file
11
config/plugins.d/info.conf
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[info]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
|
|
||||||
|
### Additional plugin configuration settings
|
||||||
|
foo = bar
|
||||||
8
config/plugins.d/log.conf
Normal file
8
config/plugins.d/log.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[log]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
8
config/plugins.d/secure.conf
Normal file
8
config/plugins.d/secure.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[secure]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
8
config/plugins.d/site.conf
Normal file
8
config/plugins.d/site.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[site]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
8
config/plugins.d/stack.conf
Normal file
8
config/plugins.d/stack.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[stack]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
8
config/plugins.d/update.conf
Normal file
8
config/plugins.d/update.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
### Example Plugin Configuration for WordOps
|
||||||
|
|
||||||
|
[update]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `example` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
82
config/wo.conf
Normal file
82
config/wo.conf
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
# WordOps Configuration
|
||||||
|
#
|
||||||
|
# All commented values are the application default
|
||||||
|
#
|
||||||
|
|
||||||
|
[wo]
|
||||||
|
|
||||||
|
### Toggle application level debug (does not toggle framework debugging)
|
||||||
|
# debug = false
|
||||||
|
|
||||||
|
### Where external (third-party) plugins are loaded from
|
||||||
|
# plugin_dir = /var/lib/wo/plugins/
|
||||||
|
|
||||||
|
### Where all plugin configurations are loaded from
|
||||||
|
# plugin_config_dir = /etc/wo/plugins.d/
|
||||||
|
|
||||||
|
### Where external templates are loaded from
|
||||||
|
# template_dir = /var/lib/wo/templates/
|
||||||
|
|
||||||
|
|
||||||
|
[log.logging]
|
||||||
|
|
||||||
|
### Where the log file lives (no log file by default)
|
||||||
|
file = /var/log/wo/wordops.log
|
||||||
|
|
||||||
|
### The level for which to log. One of: info, warn, error, fatal, debug
|
||||||
|
level = debug
|
||||||
|
|
||||||
|
### Whether or not to log to console
|
||||||
|
to_console = false
|
||||||
|
|
||||||
|
### Whether or not to rotate the log file when it reaches `max_bytes`
|
||||||
|
rotate = true
|
||||||
|
|
||||||
|
### Max size in bytes that a log file can grow until it is rotated.
|
||||||
|
max_bytes = 512000
|
||||||
|
|
||||||
|
### The maximun number of log files to maintain when rotating
|
||||||
|
max_files = 7
|
||||||
|
|
||||||
|
[stack]
|
||||||
|
|
||||||
|
### IP address that will be used in Nginx configurations while installing
|
||||||
|
ip-address = 127.0.0.1
|
||||||
|
|
||||||
|
[mysql]
|
||||||
|
|
||||||
|
### MySQL database grant host name
|
||||||
|
grant-host = localhost
|
||||||
|
|
||||||
|
### Ask for MySQL db name while site creation
|
||||||
|
db-name = False
|
||||||
|
|
||||||
|
### Ask for MySQL user name while site creation
|
||||||
|
db-user = False
|
||||||
|
|
||||||
|
[wordpress]
|
||||||
|
|
||||||
|
### Ask for WordPress prefix while site creation
|
||||||
|
prefix = False
|
||||||
|
|
||||||
|
### User name for WordPress sites
|
||||||
|
user =
|
||||||
|
|
||||||
|
### Password for WordPress sites
|
||||||
|
password =
|
||||||
|
|
||||||
|
### EMail for WordPress sites
|
||||||
|
email =
|
||||||
|
|
||||||
|
[update]
|
||||||
|
|
||||||
|
### If enabled, load a plugin named `update` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
|
|
||||||
|
[sync]
|
||||||
|
### If enabled, load a plugin named `update` either from the Python module
|
||||||
|
### `wo.cli.plugins.example` or from the file path
|
||||||
|
### `/var/lib/wo/plugins/example.py`
|
||||||
|
enable_plugin = true
|
||||||
318
docs/wo.8
Normal file
318
docs/wo.8
Normal file
@@ -0,0 +1,318 @@
|
|||||||
|
.TH wo 8 "WordOps (wo) version: 3.3.8" "Sep 10,2015" "WordOps"
|
||||||
|
.SH NAME
|
||||||
|
.B WordOps (wo)
|
||||||
|
\- Manage Nginx Based Websites.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
wo [ --version | --help | info | stack | site | debug | update | clean | import_slow_log | log | secure | sync]
|
||||||
|
.TP
|
||||||
|
wo stack [ install | remove | purge | migrate | upgrade] [ --web | --mail | --all | --nginx | --php | --php7 | --mysql | --admin | --postfix | --mailscanner | --adminer | --redis | --hhvm | --phpmyadmin | --phpredisadmin | --wpcli | --utils ]
|
||||||
|
.TP
|
||||||
|
wo stack [ status | start | stop | reload | restart ] [--all | --nginx | --php | --php7 |--mysql | --devcot | --web | --postfix | --memcache | --redis]
|
||||||
|
.TP
|
||||||
|
wo site [ list | info | show | enable | disable | edit | cd | show ] [ example.com ]
|
||||||
|
.TP
|
||||||
|
wo site create example.com [ --html | --php | --php7 | --mysql] [[--wp | --wpsubdir | --wpsubdomain ] [--wpsc | --w3tc | --wpfc | --wpredis | --hhvm | --letsencrypt/-le]]
|
||||||
|
.TP
|
||||||
|
wo site update example.com [ --php | --php7 |--mysql] [[--wp | --wpsubdir | --wpsubdomain ] [--wpsc | --w3tc | --wpfc | --wpredis | --hhvm ] [--password] [--letsencrypt=on/off/renew]]
|
||||||
|
.TP
|
||||||
|
wo site delete example.com [--db | --files | --all | --no-prompt | --force/-f ]
|
||||||
|
.TP
|
||||||
|
wo debug [ -i | --all=on/off |--nginx=on/off | --rewrite=on/off | --php=on/off | --fpm=on/off | --mysql=on/off ]
|
||||||
|
.TP
|
||||||
|
wo debug example.com [ -i | --all=on/off | --nginx=on/off | --rewrite=on/off | --wp=on/off ]
|
||||||
|
.TP
|
||||||
|
wo secure [ --auth | --port | --ip ]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
WordOps aka wo is the opensource project developed with the purpose to automate web-server configuration.
|
||||||
|
.br
|
||||||
|
WordOps is the collection of python script that provides automation for the web-server
|
||||||
|
.br
|
||||||
|
installation, site creation, services debugging & monitoring.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.B --version
|
||||||
|
.br
|
||||||
|
Display WordOps (wo) version information.
|
||||||
|
.TP
|
||||||
|
.B info
|
||||||
|
.br
|
||||||
|
wo info - Display Nginx, PHP, MySQL and wo common location information
|
||||||
|
.br
|
||||||
|
wo site info - Diplay given website details like enable, disable. weboot and log files.
|
||||||
|
.TP
|
||||||
|
.B --help
|
||||||
|
.br
|
||||||
|
Display WordOps (wo) help.
|
||||||
|
.TP
|
||||||
|
.B stack
|
||||||
|
.TP
|
||||||
|
.B install [ --all | --web | --mail | --nginx | --php | --php7 |--mysql | --redis | --postfix | --adminer | --phpmyadmin | --phpredismyadmin | --wpcli | --utils ]
|
||||||
|
.br
|
||||||
|
Install Nginx PHP5 MySQL Postfix stack Packages if not used with
|
||||||
|
.br
|
||||||
|
any options.Installs specific package if used with option.
|
||||||
|
.TP
|
||||||
|
.B remove [ --all | --web | --mail | --nginx | --php | --php7 |--mysql | --redis | --postfix | --adminer | --phpmyadmin | --phpredismyadmin | --wpcli | --utils ]
|
||||||
|
.br
|
||||||
|
Remove Nginx PHP5 MySQL Postfix stack Packages if not used with
|
||||||
|
.br
|
||||||
|
any options. Remove specific package if used with option.
|
||||||
|
.TP
|
||||||
|
.B purge [ --all | --web | --mail | --nginx | --php | --php7 |--mysql | --redis | --postfix | --adminer | --phpmyadmin | --phpredismyadmin | --wpcli | --utils ]
|
||||||
|
.br
|
||||||
|
Purge Nginx PHP5 MySQL Postfix stack Packages if not used with any
|
||||||
|
.br
|
||||||
|
options.Purge specific package if used with option.
|
||||||
|
.TP
|
||||||
|
.B status
|
||||||
|
.br
|
||||||
|
Display status of NGINX, PHP5-FPM, MySQL, Postfix, Redis-Server services.
|
||||||
|
.TP
|
||||||
|
.B start
|
||||||
|
.br
|
||||||
|
Start services NGINX, PHP5-FPM, MySQL, Postfix, Redis-Server.
|
||||||
|
.TP
|
||||||
|
.B stop
|
||||||
|
.br
|
||||||
|
Stop services NGINX, PHP5-FPM, MySQL, Postfix, Redis-Server.
|
||||||
|
.TP
|
||||||
|
.B reload
|
||||||
|
.br
|
||||||
|
Reload services NGINX, PHP5-FPM, MySQL, Postfix, Redis-Server.
|
||||||
|
.TP
|
||||||
|
.B restart
|
||||||
|
.br
|
||||||
|
Restart services NGINX, PHP5-FPM, MySQL, Postfix, Redis-Server.
|
||||||
|
.TP
|
||||||
|
.B site
|
||||||
|
.br
|
||||||
|
.TP
|
||||||
|
.B cd [ example.com ]
|
||||||
|
.br
|
||||||
|
Change directory to webroot of specified site in subshell.
|
||||||
|
.TP
|
||||||
|
.B log [ example.com ]
|
||||||
|
.br
|
||||||
|
monitor access and error logs for site specified.
|
||||||
|
.TP
|
||||||
|
.B list [ --enabled | --disabled ]
|
||||||
|
.br
|
||||||
|
Lists all available sites from /etc/nginx/sites-enabled/
|
||||||
|
.br
|
||||||
|
by default & enable argument. Display sites list from
|
||||||
|
.br
|
||||||
|
/etc/nginx/sites-available/ if used with available option.
|
||||||
|
.TP
|
||||||
|
.B info [ example.com ]
|
||||||
|
.br
|
||||||
|
prints information about site such as access log, error log
|
||||||
|
.br
|
||||||
|
location and type of site.
|
||||||
|
.TP
|
||||||
|
.B show [ example.com ]
|
||||||
|
.br
|
||||||
|
Display NGINX configuration of site.
|
||||||
|
.TP
|
||||||
|
.B enable [ example.com ]
|
||||||
|
.br
|
||||||
|
Enable site by creating softlink with site file in
|
||||||
|
.br
|
||||||
|
/etc/nginx/sites-available to /etc/nginx/sites-enabled/.
|
||||||
|
.TP
|
||||||
|
.B disable [ example.com ]
|
||||||
|
.br
|
||||||
|
Disable site by Destroying softlink with site file in
|
||||||
|
.br
|
||||||
|
/etc/nginx/sites-available to /etc/nginx/sites-enabled/.
|
||||||
|
.TP
|
||||||
|
.B edit [ example.com ]
|
||||||
|
.br
|
||||||
|
Edit NGINX configuration of site.
|
||||||
|
.TP
|
||||||
|
.B create [ example.com ] [ --html | --php | --php7 |--mysql] [[--wp | --wpsubdir | --wpsubdomain ] [--wpsc | --w3tc | --wpfc | --wpredis | --hhvm ]]
|
||||||
|
.br
|
||||||
|
Create new site according to given options. If no options provided
|
||||||
|
.br
|
||||||
|
create static site with html only.
|
||||||
|
.TP
|
||||||
|
.B update [ example.com ] [ --html | --php | --php7 |--mysql] [[--wp | --wpsubdir | --wpsubdomain ] [ --wpsc | --w3tc | --wpfc | --wpredis | --hhvm ] [--password]]
|
||||||
|
.br
|
||||||
|
Update site configuration according to specified options.
|
||||||
|
.TP
|
||||||
|
.B delete [ example.com ] [--no-prompt ] [--force/-f] [ --db | --files | --all ]
|
||||||
|
.br
|
||||||
|
Delete site i.e webroot, database, ad configuration permanently.
|
||||||
|
.TP
|
||||||
|
.B debug [ -i | --nginx=on/off | --php=on/off | --php7=on/off | --mysql=on/off | --rewrite=on/off | --fpm=on/off | --fpm7=on/off ]
|
||||||
|
.br
|
||||||
|
Starts server level debugging. If this is used without arguments it will start debugging
|
||||||
|
.br
|
||||||
|
all services.Else it will debug only service provided with argument.This will Stop
|
||||||
|
.br
|
||||||
|
Debugging if used with --all=off argument.
|
||||||
|
.TP
|
||||||
|
.B debug example.com [ -i | --nginx=on/off | --rewrite=on/off | --wp=on/off | --all=on/off ]
|
||||||
|
.br
|
||||||
|
Starts site level debugging. If this is used without arguments it will start debugging all
|
||||||
|
.br
|
||||||
|
services.Else it will debug only service provided with argument.This will Stop Debugging
|
||||||
|
.br
|
||||||
|
if used with --all=off argument.
|
||||||
|
.TP
|
||||||
|
.B secure [ --auth | --port | --ip ]
|
||||||
|
.br
|
||||||
|
Update security settings.
|
||||||
|
.TP
|
||||||
|
.B clean [ --fastcgi | --opcache | --memcache | --redis | --all ]
|
||||||
|
.br
|
||||||
|
Clean NGINX fastCGI cache, Opcache, Memcache, Redis cache.
|
||||||
|
.br
|
||||||
|
Clean NGINX fastCGI cache if no option specified.
|
||||||
|
.SH ARGUMENTS
|
||||||
|
.TP
|
||||||
|
.B -i
|
||||||
|
.br
|
||||||
|
setup intractive mode while used with debug.
|
||||||
|
.TP
|
||||||
|
.B --nginx=on/off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to start or stop nginx debugging.
|
||||||
|
.TP
|
||||||
|
.B --php=on/off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to start or stop php debugging.
|
||||||
|
.TP
|
||||||
|
.B --php7=on/off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to start or stop php7 debugging.
|
||||||
|
.TP
|
||||||
|
.B --mysql=on/off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to start or stop mysql debugging.
|
||||||
|
.TP
|
||||||
|
.B --rewrite=on/off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to start or stop nginx rewrite rules debugging.
|
||||||
|
.TP
|
||||||
|
.B --fpm=on/off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to start or stop fpm debugging.
|
||||||
|
.TP
|
||||||
|
.B --wp=on/off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to start or stop wordpress site debugging.
|
||||||
|
.TP
|
||||||
|
.B --all=on/off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to stop debugging.
|
||||||
|
.TP
|
||||||
|
.B --all=off
|
||||||
|
.br
|
||||||
|
used with wo debug command. used to stop debugging.
|
||||||
|
.TP
|
||||||
|
.B --html
|
||||||
|
.br
|
||||||
|
Create a HTML website.
|
||||||
|
.TP
|
||||||
|
.B --php
|
||||||
|
.br
|
||||||
|
Create a PHP website.
|
||||||
|
.TP
|
||||||
|
.B --mysql
|
||||||
|
.br
|
||||||
|
Create a PHP+MySQL website.
|
||||||
|
.TP
|
||||||
|
.B --wp
|
||||||
|
.br
|
||||||
|
Create a WordPress Website.
|
||||||
|
.TP
|
||||||
|
.B --wpsubdir
|
||||||
|
.br
|
||||||
|
Create a Wordpress Multisite with Sub Directories Setup.
|
||||||
|
.TP
|
||||||
|
.B --wpsubdomain
|
||||||
|
.br
|
||||||
|
Create a Wordpress Multisite with Sub Domains Setup.
|
||||||
|
.br
|
||||||
|
.TP
|
||||||
|
.B --db
|
||||||
|
.br
|
||||||
|
Delete website database.
|
||||||
|
.br
|
||||||
|
.TP
|
||||||
|
.B --files
|
||||||
|
.br
|
||||||
|
Delete website webroot.
|
||||||
|
.br
|
||||||
|
.TP
|
||||||
|
.B --no-prompt
|
||||||
|
.br
|
||||||
|
Does not prompt for confirmation when delete command used.
|
||||||
|
.br
|
||||||
|
.TP
|
||||||
|
.B --force/-f
|
||||||
|
.br
|
||||||
|
Delete website webroot and database forcefully.Remove nginx configuration for site.
|
||||||
|
.br
|
||||||
|
.TP
|
||||||
|
.B --auth
|
||||||
|
.br
|
||||||
|
used with wo secure command. Update credential of HTTP authentication
|
||||||
|
.TP
|
||||||
|
.B --port
|
||||||
|
.br
|
||||||
|
used with wo secure command. Change WordOps admin port 22222.
|
||||||
|
.TP
|
||||||
|
.B --ip
|
||||||
|
.br
|
||||||
|
used with wo secure command. Update whitelist IP address
|
||||||
|
.SH WORDPRESS CACHING OPTIONS
|
||||||
|
.TP
|
||||||
|
.B --wpsc
|
||||||
|
.br
|
||||||
|
Install and activate Nginx-helper and WP Super Cache plugin.
|
||||||
|
.TP
|
||||||
|
.B --wpfc
|
||||||
|
.br
|
||||||
|
Install and activate Nginx-helper and W3 Total Cache plugin with
|
||||||
|
.br
|
||||||
|
Nginx FastCGI cache.
|
||||||
|
.TP
|
||||||
|
.B --wpredis
|
||||||
|
.br
|
||||||
|
Install, activate, configure Nginx-helper and Redis Object Cache Plugin, Configure NGINX for Redis Page Caching.
|
||||||
|
.TP
|
||||||
|
.B --hhvm
|
||||||
|
.br
|
||||||
|
Install, activate Nginx-helper and configure NGINX for HHVM.
|
||||||
|
.SH FILES
|
||||||
|
.br
|
||||||
|
/etc/wo/wo.conf
|
||||||
|
.SH BUGS
|
||||||
|
Report bugs at <http://github.com/WordOps/WordOps/issues/>
|
||||||
|
.SH AUTHOR
|
||||||
|
.br
|
||||||
|
.B rtCamp Team
|
||||||
|
.I \<admin@rtcamp.com\>
|
||||||
|
.br
|
||||||
|
.B Mitesh Shah
|
||||||
|
.I \<Mitesh.Shah@rtcamp.com\>
|
||||||
|
.br
|
||||||
|
.B Manish
|
||||||
|
.I \<Manish.Songirkar@rtcamp.com\>
|
||||||
|
.br
|
||||||
|
.B Gaurav
|
||||||
|
.I \<Gaurav.Astikar@rtcamp.com\>
|
||||||
|
.br
|
||||||
|
.B Harshad
|
||||||
|
.I \<harshad.yeola@rtcamp.com>
|
||||||
|
.br
|
||||||
|
.B Prabuddha
|
||||||
|
.I \<prabuddha.chakraborty@rtcamp.com\>
|
||||||
|
.br
|
||||||
|
.B Shital
|
||||||
|
.I \<shital.patil@rtcamp.com\>
|
||||||
|
.br
|
||||||
|
.B Rajdeep Sharma
|
||||||
|
.I \<rajdeep.sharma@rtcamp.com\>
|
||||||
|
.br
|
||||||
744
install
Normal file
744
install
Normal file
@@ -0,0 +1,744 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# WordOps update script.
|
||||||
|
# This script is designed to install latest WordOps or
|
||||||
|
# to update current WordOps from the v3 branch of EasyEngine.
|
||||||
|
|
||||||
|
# Define echo function
|
||||||
|
|
||||||
|
# Blue color
|
||||||
|
function wo_lib_echo()
|
||||||
|
{
|
||||||
|
echo $(tput setaf 4)$@$(tput sgr0)
|
||||||
|
}
|
||||||
|
# White color
|
||||||
|
function wo_lib_echo_info()
|
||||||
|
{
|
||||||
|
echo $(tput setaf 7)$@$(tput sgr0)
|
||||||
|
}
|
||||||
|
# Red color
|
||||||
|
function wo_lib_echo_fail()
|
||||||
|
{
|
||||||
|
echo $(tput setaf 1)$@$(tput sgr0)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Checking permissions
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
wo_lib_echo_fail "Sudo privilege required..."
|
||||||
|
wo_lib_echo_fail "Uses: wget -qO wo wordops.se/tup && sudo bash wo"
|
||||||
|
exit 100
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Capture errors
|
||||||
|
function wo_lib_error()
|
||||||
|
{
|
||||||
|
echo "[ `date` ] $(tput setaf 1)$@$(tput sgr0)"
|
||||||
|
exit $2
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute: apt-get update
|
||||||
|
wo_lib_echo "Executing apt-get update, please wait..."
|
||||||
|
apt-get update &>> /dev/null
|
||||||
|
|
||||||
|
# Checking lsb_release package
|
||||||
|
if [ ! -x /usr/bin/lsb_release ]; then
|
||||||
|
wo_lib_echo "Installing lsb-release, please wait..."
|
||||||
|
apt-get -y install lsb-release &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define variables for later use
|
||||||
|
wo_branch=$1
|
||||||
|
readonly wo_version_old="2.2.3"
|
||||||
|
readonly wo_version_new="3.8.1"
|
||||||
|
readonly wo_log_dir=/var/log/wo/
|
||||||
|
readonly wo_install_log=/var/log/wo/install.log
|
||||||
|
readonly wo_linux_distro=$(lsb_release -i | awk '{print $3}')
|
||||||
|
readonly wo_distro_version=$(lsb_release -sc)
|
||||||
|
|
||||||
|
# Checking linux distro
|
||||||
|
if [ "$wo_linux_distro" != "Ubuntu" ] && [ "$wo_linux_distro" != "Debian" ]; then
|
||||||
|
wo_lib_echo_fail "WordOps (wo) only supports Ubuntu and Debian at the moment."
|
||||||
|
wo_lib_echo_fail "If you are feeling adventurous, you are free to fork WordOps to support"
|
||||||
|
wo_lib_echo_fail "other Linux distributions and perhaps even Unix deratives."
|
||||||
|
wo_lib_echo_fail "WordOps (wo) only supports Ubuntu 14.04/16.04/18.04, Debian 8.x and Debian 9.x"
|
||||||
|
exit 100
|
||||||
|
fi
|
||||||
|
|
||||||
|
# WordOps (wo) only supports Ubuntu/Debian versions that are eligible for support
|
||||||
|
lsb_release -d | egrep -e "14.04|16.04|18.04|jessie|stretch" &>> /dev/null
|
||||||
|
if [ "$?" -ne "0" ]; then
|
||||||
|
wo_lib_echo_fail "WordOps (wo) only supports Ubuntu 14.04/16.04/18.04, Debian 8.x and Debian 9.x"
|
||||||
|
exit 100
|
||||||
|
fi
|
||||||
|
|
||||||
|
# To prevent errors or unexpected behaviour, create
|
||||||
|
# the log directory and properly set the ACL.
|
||||||
|
if [ ! -d $wo_log_dir ]; then
|
||||||
|
|
||||||
|
wo_lib_echo "Creating WordOps log directory, just a second..."
|
||||||
|
mkdir -p $wo_log_dir || wo_lib_error "Whoops - seems we are unable to create the log directory $wo_log_dir, exit status " $?
|
||||||
|
|
||||||
|
# Touch/create two empty log files within the wo_log_dir
|
||||||
|
touch /var/log/wo/{wordops.log,install.log}
|
||||||
|
|
||||||
|
# Set the ACL to only allow access by the root user and block others
|
||||||
|
chmod -R 700 /var/log/wo || wo_lib_error "Whoops, there was an error setting the permissions on the WordOps log folder, exit status " $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install a few dependencies (python v3, git, tar and python-software-properties),
|
||||||
|
# plus generate the locale afterwards.
|
||||||
|
function wo_install_dep()
|
||||||
|
{
|
||||||
|
if [ "$wo_linux_distro" == "Ubuntu" ]; then
|
||||||
|
apt-get -y install build-essential curl gzip python3 python3-apt python3-setuptools python3-dev sqlite3 git tar software-properties-common || wo_lib_error "There was an error during dependency installation, exit status " 1
|
||||||
|
elif [ "$wo_linux_distro" == "Debian" ]; then
|
||||||
|
apt-get -y install build-essential curl gzip dirmngr python3 python3-apt python3-setuptools python3-dev sqlite3 git tar python-software-properties || wo_lib_error "There was an error during dependency installation, exit status " 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Generate the locale, output to the blackhole rather than STDOUT
|
||||||
|
locale-gen en &>> /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create the WordOps database and intialize it
|
||||||
|
function wo_sync_db()
|
||||||
|
{
|
||||||
|
if [ ! -f /var/lib/wo/dbase.db ]; then
|
||||||
|
mkdir -p /var/lib/wo
|
||||||
|
|
||||||
|
echo "CREATE TABLE sites (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
sitename UNIQUE,
|
||||||
|
site_type CHAR,
|
||||||
|
cache_type CHAR,
|
||||||
|
site_path CHAR,
|
||||||
|
created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
is_enabled INT,
|
||||||
|
is_ssl INT,
|
||||||
|
storage_fs CHAR,
|
||||||
|
storage_db CHAR,
|
||||||
|
db_name VARCHAR,
|
||||||
|
db_user VARCHAR,
|
||||||
|
db_password VARCHAR,
|
||||||
|
db_host VARCHAR,
|
||||||
|
is_hhvm INT INT DEFAULT '0',
|
||||||
|
php_version VARCHAR
|
||||||
|
);" | sqlite3 /var/lib/wo/dbase.db
|
||||||
|
|
||||||
|
# Check site is enable/live or disable
|
||||||
|
for site in $(ls /etc/nginx/sites-available/ | grep -v default);
|
||||||
|
do
|
||||||
|
if [ -f /etc/nginx/sites-enabled/$site ]; then
|
||||||
|
wo_site_status='1'
|
||||||
|
else
|
||||||
|
wo_site_status='0'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Acquire information about the current nginx configuration
|
||||||
|
wo_site_current_type=$(head -n1 /etc/nginx/sites-available/$site | grep "NGINX CONFIGURATION" | rev | cut -d' ' -f3,4,5,6,7 | rev | cut -d ' ' -f2,3,4,5)
|
||||||
|
|
||||||
|
# Sniff out the vhost type and cache configuration
|
||||||
|
if [ "$wo_site_current_type" = "HTML" ]; then
|
||||||
|
wo_site_current="html"
|
||||||
|
wo_site_current_cache="basic"
|
||||||
|
elif [ "$wo_site_current_type" = "PHP" ]; then
|
||||||
|
wo_site_current="php"
|
||||||
|
wo_site_current_cache="basic"
|
||||||
|
elif [ "$wo_site_current_type" = "MYSQL" ]; then
|
||||||
|
wo_site_current="mysql"
|
||||||
|
wo_site_current_cache="basic"
|
||||||
|
|
||||||
|
# Caching types on a single WordPress installation
|
||||||
|
elif [ "$wo_site_current_type" = "WPSINGLE BASIC" ]; then
|
||||||
|
wo_site_current="wp"
|
||||||
|
wo_site_current_cache="basic"
|
||||||
|
|
||||||
|
elif [ "$wo_site_current_type" = "WPSINGLE WP SUPER CACHE" ]; then
|
||||||
|
wo_site_current="wp"
|
||||||
|
wo_site_current_cache="wpsc"
|
||||||
|
|
||||||
|
elif [ "$wo_site_current_type" = "WPSINGLE FAST CGI" ] || [ "$wo_site_current_type" = "WPSINGLE FASTCGI" ]; then
|
||||||
|
wo_site_current="wp"
|
||||||
|
wo_site_current_cache="wpfc"
|
||||||
|
|
||||||
|
# Caching types on a single, subdirectory WordPress installation
|
||||||
|
elif [ "$wo_site_current_type" = "WPSUBDIR BASIC" ]; then
|
||||||
|
wo_site_current="wpsubdir"
|
||||||
|
wo_site_current_cache="basic"
|
||||||
|
|
||||||
|
elif [ "$wo_site_current_type" = "WPSUBDIR WP SUPER CACHE" ]; then
|
||||||
|
wo_site_current="wpsubdir"
|
||||||
|
wo_site_current_cache="wpsc"
|
||||||
|
|
||||||
|
elif [ "$wo_site_current_type" = "WPSUBDIR FAST CGI" ] || [ "$wo_site_current_type" = "WPSUBDIR FASTCGI" ]; then
|
||||||
|
wo_site_current="wpsubdir"
|
||||||
|
wo_site_current_cache="wpfc"
|
||||||
|
|
||||||
|
# Caching types on a single, subdomain WordPress installation
|
||||||
|
elif [ "$wo_site_current_type" = "WPSUBDOMAIN BASIC" ]; then
|
||||||
|
wo_site_current="wpsubdomain"
|
||||||
|
wo_site_current_cache="basic"
|
||||||
|
|
||||||
|
elif [ "$wo_site_current_type" = "WPSUBDOMAIN WP SUPER CACHE" ]; then
|
||||||
|
wo_site_current="wpsubdomain"
|
||||||
|
wo_site_current_cache="wpsc"
|
||||||
|
|
||||||
|
elif [ "$wo_site_current_type" = "WPSUBDOMAIN FAST CGI" ] || [ "$wo_site_current_type" = "WPSUBDOMAIN FASTCGI" ]; then
|
||||||
|
wo_site_current="wpsubdomain"
|
||||||
|
wo_site_current_cache="wpfc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
wo_webroot="/var/www/$site"
|
||||||
|
|
||||||
|
# Import the configuration into the WordOps SQLite database
|
||||||
|
echo "INSERT INTO sites (sitename, site_type, cache_type, site_path, is_enabled, is_ssl, storage_fs, storage_db)
|
||||||
|
VALUES (\"$site\", \"$wo_site_current\", \"$wo_site_current_cache\", \"$wo_webroot\", \"$wo_site_status\", 0, 'ext4', 'mysql');" | sqlite3 /var/lib/wo/dbase.db
|
||||||
|
|
||||||
|
done
|
||||||
|
else
|
||||||
|
wo_php_version=$(php -v | head -n1 | cut -d' ' -f2 |cut -c1-3)
|
||||||
|
wo_lib_echo "Updating WordOps Database"
|
||||||
|
echo "ALTER TABLE sites ADD COLUMN db_name varchar;" | sqlite3 /var/lib/wo/dbase.db
|
||||||
|
echo "ALTER TABLE sites ADD COLUMN db_user varchar; " | sqlite3 /var/lib/wo/dbase.db
|
||||||
|
echo "ALTER TABLE sites ADD COLUMN db_password varchar;" | sqlite3 /var/lib/wo/dbase.db
|
||||||
|
echo "ALTER TABLE sites ADD COLUMN db_host varchar;" | sqlite3 /var/lib/wo/dbase.db
|
||||||
|
echo "ALTER TABLE sites ADD COLUMN is_hhvm INT DEFAULT '0';" | sqlite3 /var/lib/wo/dbase.db
|
||||||
|
echo "ALTER TABLE sites ADD COLUMN php_version varchar DEFAULT \"$wo_php_version\";" | sqlite3 /var/lib/wo/dbase.db
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Once again, set the proper ACL on the WordOps configuration directory
|
||||||
|
function secure_wo_db()
|
||||||
|
{
|
||||||
|
# The owner is root
|
||||||
|
chown -R root:root /var/lib/wo/
|
||||||
|
# Only allow access by root, block others
|
||||||
|
chmod -R 600 /var/lib/wo/
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update the WP-CLI version
|
||||||
|
function wo_update_wp_cli()
|
||||||
|
{
|
||||||
|
wo_lib_echo "Updating WP-CLI version to resolve compatibility issue."
|
||||||
|
PHP_PATH=$(which php)
|
||||||
|
WP_CLI_PATH=$(which wp)
|
||||||
|
if [ "${WP_CLI_PATH}" != "" ]; then
|
||||||
|
# Obtain the current WP-CLI version
|
||||||
|
WP_CLI_VERSION=$(${PHP_PATH} ${WP_CLI_PATH} --allow-root cli version | awk '{ print $2 }')
|
||||||
|
dpkg --compare-versions ${WP_CLI_VERSION} lt 1.4.1
|
||||||
|
# Update WP-CLI to the most recent version
|
||||||
|
if [ "$?" == "0" ]; then
|
||||||
|
wget -qO ${WP_CLI_PATH} https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
|
||||||
|
chmod +x ${WP_CLI_PATH}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Now, finally, let's install WordOps
|
||||||
|
function wo_install()
|
||||||
|
{
|
||||||
|
# Remove old versions of EasyEngine/WordOps
|
||||||
|
rm -rf /tmp/easyengine &>> /dev/null
|
||||||
|
rm -rf /tmp/wordops &>> /dev/null
|
||||||
|
|
||||||
|
# Clone the latest version directly from GitHub
|
||||||
|
wo_lib_echo "Downloading WordOps straight from GitHub - fresh and brewed with love. Hold your horses..."
|
||||||
|
if [ "$wo_branch" = "" ]; then
|
||||||
|
wo_branch=master
|
||||||
|
fi
|
||||||
|
|
||||||
|
git clone -b $wo_branch https://github.com/WordOps/WordOps.git /tmp/wordops --quiet > /dev/null \
|
||||||
|
|| wo_lib_error "An error was encountered during the download, exit status" $?
|
||||||
|
|
||||||
|
cd /tmp/wordops
|
||||||
|
wo_lib_echo "The moment you've all been waiting for, time to install WordOps!"
|
||||||
|
python3 setup.py install || wo_lib_error "An error was encountered during the installation, exit status " $?
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update the WordOps installation,
|
||||||
|
# remove old versions
|
||||||
|
function wo_update()
|
||||||
|
{
|
||||||
|
wo_lib_echo "Importing the EasyEngine configuration and magically importing it to WordOps."
|
||||||
|
wo_lib_echo "No worries, we'll make sure the configuration is duly backupped..."
|
||||||
|
wo_grant_host=$(grep grant-host /etc/easyengine/ee.conf | awk '{ print $3 }' | head -1 )
|
||||||
|
wo_db_name=$(grep db-name /etc/easyengine/ee.conf | awk '{ print $3 }')
|
||||||
|
wo_db_user=$(grep db-name /etc/easyengine/ee.conf | awk '{ print $3 }')
|
||||||
|
wo_wp_prefix=$(grep prefix /etc/easyengine/ee.conf | awk '{ print $3 }')
|
||||||
|
wo_wp_user=$(grep 'user ' /etc/easyengine/ee.conf | grep -v db-user |awk '{ print $3 }')
|
||||||
|
wo_wp_pass=$(grep password /etc/easyengine/ee.conf | awk '{ print $3 }')
|
||||||
|
wo_wp_email=$(grep email /etc/easyengine/ee.conf | awk '{ print $3 }')
|
||||||
|
wo_ip_addr=$(grep ip-address /etc/easyengine/ee.conf |awk -F'=' '{ print $2 }')
|
||||||
|
|
||||||
|
sed -i "s/ip-address.*/ip-address = ${wo_ip_addr}/" /etc/wo/wo.conf && \
|
||||||
|
sed -i "s/grant-host.*/grant-host = ${wo_grant_host}/" /etc/ee/wo.conf && \
|
||||||
|
sed -i "s/db-name.*/db-name = ${db-name}/" /etc/ee/wo.conf && \
|
||||||
|
sed -i "s/db-user.*/db-user = ${wo_db_user}/" /etc/wo/wo.conf && \
|
||||||
|
sed -i "s/prefix.*/prefix = ${wo_wp_prefix}/" /etc/wo/wo.conf && \
|
||||||
|
sed -i "s/^user.*/user = ${wo_wp_user}/" /etc/wo/wo.conf && \
|
||||||
|
sed -i "s/password.*/password = ${wo_wp_password}/" /etc/wo/wo.conf && \
|
||||||
|
sed -i "s/email.*/email = ${wo_wp_email}/" /etc/wo/wo.conf || wo_lib_error "An error was encountered during the configuration update, exit status " $?
|
||||||
|
|
||||||
|
wo_lib_echo "Removing EasyEngine 2.x"
|
||||||
|
rm -rf /etc/bash_completion.d/ee /etc/easyengine/ /usr/share/easyengine/ /usr/local/lib/easyengine /usr/local/sbin/easyengine /usr/local/sbin/ee /var/log/easyengine
|
||||||
|
|
||||||
|
# Softlink to fix command not found error
|
||||||
|
ln -s /usr/local/bin/wo /usr/local/sbin/wo || wo_lib_error "Unable to softlink the WordOps binary, exit status " $?
|
||||||
|
}
|
||||||
|
|
||||||
|
function wo_upgrade_php(){
|
||||||
|
# Change the PHP repository for PHP 7.x support
|
||||||
|
if [ "$wo_distro_version" == "trusty" ]; then
|
||||||
|
if [ -f /etc/apt/sources.list.d/ondrej-php5-5_6-trusty.list ]; then
|
||||||
|
# add-apt-repository -y --remove 'ppa:ondrej/php5-5.6'
|
||||||
|
add-apt-repository -y 'ppa:ondrej/php'
|
||||||
|
wo_lib_echo "Updating the PHP repository for some neat PHP 7 support"
|
||||||
|
apt-get update &>> /dev/null
|
||||||
|
apt-get -y install php5.6-fpm php5.6-curl php5.6-gd php5.6-imap php5.6-mcrypt php5.6-readline php5.6-mysql php5.6-cli php5.6-common php5.6-curl php5.6-mbstring php5.6-bcmath php5.6-recode php5.6-mysql php5.6-opcache php-memcached php-imagick memcached php-pear php-xdebug php-msgpack php5.6-zip php5.6-xml php5.6-soap php-memcache || wo_lib_error "Unable to install PHP 5.6 packages, exit status " 1
|
||||||
|
if [ -e /etc/php5/fpm/pool.d/www.conf -a -e /etc/php5/fpm/pool.d/debug.conf -a -e /etc/php5/fpm/php.ini -a -e /etc/php5/fpm/php-fpm.conf ]; then
|
||||||
|
cp -f /etc/php5/fpm/pool.d/www.conf /etc/php/5.6/fpm/pool.d/www.conf &>> /dev/null
|
||||||
|
cp -f /etc/php5/fpm/pool.d/debug.conf /etc/php/5.6/fpm/pool.d/debug.conf &>> /dev/null
|
||||||
|
cp -f /etc/php5/fpm/php.ini /etc/php/5.6/fpm/php.ini &>> /dev/null
|
||||||
|
cp -f /etc/php5/fpm/php-fpm.conf /etc/php/5.6/fpm/php-fpm.conf &>> /dev/null
|
||||||
|
else
|
||||||
|
echo "Some expected files are missing." || wo_lib_error "Unable to configure PHP 5.6 packages, exit status " 1
|
||||||
|
fi
|
||||||
|
sed -i "s/pid.*/pid = \/run\/php\/php5.6-fpm.pid/" /etc/php/5.6/fpm/php-fpm.conf && \
|
||||||
|
sed -i "s/error_log.*/error_log = \/var\/log\/php\/5.6\/fpm.log/" /etc/php/5.6/fpm/php-fpm.conf && \
|
||||||
|
sed -i "s/log_level.*/log_level = notice/" /etc/php/5.6/fpm/php-fpm.conf && \
|
||||||
|
sed -i "s/include.*/include = \/etc\/php\/5.6\/fpm\/pool.d\/*.conf/" /etc/php/5.6/fpm/php-fpm.conf && \
|
||||||
|
sed -i "s/slowlog =.*/slowlog = \/var\/log\/php\/5.6\/slow.log/" /etc/php/5.6/fpm/pool.d/debug.conf || wo_lib_error "An error was encountered during the configuration update, exit status " $?
|
||||||
|
mkdir -p /var/log/php/5.6/
|
||||||
|
touch /var/log/php/5.6/slow.log /var/log/php/5.6/fpm.log
|
||||||
|
service php5-fpm stop &>> /dev/null
|
||||||
|
service php5.6-fpm restart &>> /dev/null
|
||||||
|
rm -f /etc/apt/sources.list.d/ondrej-php5-5_6-trusty.list &>> /dev/null
|
||||||
|
apt-get remove -y php5-fpm php5-curl php5-gd php5-imap php5-mcrypt php5-common php5-readline php5-mysql php5-cli php5-memcache php5-imagick memcached graphviz php-pear
|
||||||
|
|
||||||
|
# Fix for PHP 5.6 + 7.0 missed packages
|
||||||
|
elif [ -f /etc/php/mods-available/readline.ini ]; then
|
||||||
|
mkdir -p /tmp/php-conf/5.6
|
||||||
|
mkdir -p /tmp/php-conf/7.0
|
||||||
|
cp -f /etc/php/5.6/fpm/pool.d/www.conf /tmp/php-conf/5.6 &>> /dev/null
|
||||||
|
cp -f /etc/php/5.6/fpm/pool.d/debug.conf /tmp/php-conf/5.6 &>> /dev/null
|
||||||
|
cp -f /etc/php/5.6/fpm/php.ini /tmp/php-conf/5.6 &>> /dev/null
|
||||||
|
cp -f /etc/php/5.6/fpm/php-fpm.conf /tmp/php-conf/5.6 &>> /dev/null
|
||||||
|
|
||||||
|
cp -f /etc/php/7.0/fpm/pool.d/www.conf /tmp/php-conf/7.0 &>> /dev/null
|
||||||
|
cp -f /etc/php/7.0/fpm/pool.d/debug.conf /tmp/php-conf/7.0 &>> /dev/null
|
||||||
|
cp -f /etc/php/7.0/fpm/php.ini /tmp/php-conf/7.0 &>> /dev/null
|
||||||
|
cp -f /etc/php/7.0/fpm/php-fpm.conf /tmp/php-conf/7.0 &>> /dev/null
|
||||||
|
|
||||||
|
|
||||||
|
apt-get -y install php5.6-fpm php5.6-curl php5.6-gd php5.6-imap php5.6-mcrypt php5.6-readline php5.6-mysql php5.6-cli php5.6-common php5.6-curl php5.6-mbstring php5.6-bcmath php5.6-recode php5.6-mysql php5.6-opcache php-memcached php-imagick memcached php-pear php-xdebug php-msgpack php5.6-zip php5.6-xml php-memcache || wo_lib_error "Unable to install PHP 5.6 packages, exit status " 1
|
||||||
|
dpkg-query -W -f='${Status} ${Version}\n' php7.0-fpm 2>/dev/null | grep installed
|
||||||
|
if [ "$?" -eq "0" ]; then
|
||||||
|
apt-get -y install php7.0-fpm php7.0-curl php7.0-gd php7.0-imap php7.0-mcrypt php7.0-readline php7.0-common php7.0-recode php7.0-mysql php7.0-cli php7.0-curl php7.0-mbstring php7.0-bcmath php7.0-mysql php7.0-opcache php7.0-zip php7.0-xml php-memcached php-imagick php-memcache memcached php-pear php-xdebug php-msgpack php7.0-soap || wo_lib_error "Unable to install PHP 7.0 packages, exit status " 1
|
||||||
|
mv -f /tmp/php-conf/7.0/www.conf /etc/php/7.0/fpm/pool.d/www.conf &>> /dev/null
|
||||||
|
mv -f /tmp/php-conf/7.0/debug.conf /etc/php/7.0/fpm/pool.d/debug.conf &>> /dev/null
|
||||||
|
mv -f /tmp/php-conf/7.0/php.ini /etc/php/7.0/fpm/php.ini &>> /dev/null
|
||||||
|
mv -f /tmp/php-conf/7.0/php-fpm.conf /etc/php/7.0/fpm/php-fpm.conf &>> /dev/null
|
||||||
|
service php7.0-fpm restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv -f /tmp/php-conf/5.6/www.conf /etc/php/5.6/fpm/pool.d/www.conf &>> /dev/null
|
||||||
|
mv -f /tmp/php-conf/5.6/debug.conf /etc/php/5.6/fpm/pool.d/debug.conf &>> /dev/null
|
||||||
|
mv -f /tmp/php-conf/5.6/php.ini /etc/php/5.6/fpm/php.ini &>> /dev/null
|
||||||
|
mv -f /tmp/php-conf/5.6/php-fpm.conf /etc/php/5.6/fpm/php-fpm.conf &>> /dev/null
|
||||||
|
|
||||||
|
service php5.6-fpm restart &>> /dev/null
|
||||||
|
rm -rf /tmp/php-conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function wo_update_latest()
|
||||||
|
{
|
||||||
|
|
||||||
|
if [ -f /etc/nginx/fastcgi_params ]
|
||||||
|
then
|
||||||
|
cat /etc/nginx/fastcgi_params| grep -q 'HTTP_PROXY'
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "fastcgi_param HTTP_PROXY \"\";" >> /etc/nginx/fastcgi_params
|
||||||
|
echo "fastcgi_param HTTP_PROXY \"\";" >> /etc/nginx/fastcgi.conf
|
||||||
|
service nginx restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f /etc/ImageMagick/policy.xml ]
|
||||||
|
then
|
||||||
|
if [ ! -f /etc/ImageMagick/patch.txt ]
|
||||||
|
then
|
||||||
|
echo -e "\t<policy domain="coder" rights="none" pattern="EPHEMERAL" />\n\t<policy domain="coder" rights="none" pattern="URL" />\n\t<policy domain="coder" rights="none" pattern="HTTPS" />\n\t<policy domain="coder" rights="none" pattern="MVG" />\n\t<policy domain="coder" rights="none" pattern="MSL" />" >> /etc/ImageMagick/patch.txt
|
||||||
|
sed -i '/<policymap>/r /etc/ImageMagick/patch.txt' /etc/ImageMagick/policy.xml
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Move ~/.my.cnf to /etc/mysql/conf.d/my.cnf
|
||||||
|
if [ ! -f /etc/mysql/conf.d/my.cnf ]
|
||||||
|
then
|
||||||
|
#create conf.d folder if not exist
|
||||||
|
if [ ! -d /etc/mysql/conf.d ]; then
|
||||||
|
mkdir -p /etc/mysql/conf.d
|
||||||
|
chmod 755 /etc/mysql/conf.d
|
||||||
|
fi
|
||||||
|
if [ -d /etc/mysql/conf.d ]
|
||||||
|
then
|
||||||
|
if [ -f ~/.my.cnf ]
|
||||||
|
then
|
||||||
|
cp ~/.my.cnf /etc/mysql/conf.d/my.cnf &>> /dev/null
|
||||||
|
chmod 600 /etc/mysql/conf.d/my.cnf
|
||||||
|
else
|
||||||
|
if [ -f /root/.my.cnf ]
|
||||||
|
then
|
||||||
|
cp /root/.my.cnf /etc/mysql/conf.d/my.cnf &>> /dev/null
|
||||||
|
chmod 600 /etc/mysql/conf.d/my.cnf
|
||||||
|
else
|
||||||
|
wo_lib_echo_fail ".my.cnf cannot be located in your current user or root folder..."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ -f /etc/nginx/nginx.conf ]; then
|
||||||
|
wo_lib_echo "Updating Nginx configuration, please wait..."
|
||||||
|
# From version 3.1.10 we are using Suse builder for repository
|
||||||
|
if [ "$wo_distro_version" == "precise" ]; then
|
||||||
|
|
||||||
|
wo_lib_echo_fail ".my.cnf cannot be located in your current user or root folder..."
|
||||||
|
|
||||||
|
elif [ "$wo_distro_version" == "trusty" ]; then
|
||||||
|
grep -Hr 'http://download.opensuse.org/repositories/home:/rtCamp:/EasyEngine/xUbuntu_14.04/ /' /etc/apt/sources.list.d/ &>> /dev/null
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
if [ -f /etc/apt/sources.list.d/rtcamp-nginx-trusty.list ]; then
|
||||||
|
rm -rf /etc/apt/sources.list.d/rtcamp-nginx-trusty.list
|
||||||
|
fi
|
||||||
|
echo -e "\ndeb http://download.opensuse.org/repositories/home:/rtCamp:/EasyEngine/xUbuntu_14.04/ /" >> /etc/apt/sources.list.d/wo-repo.list
|
||||||
|
gpg --keyserver "hkp://pgp.mit.edu" --recv-keys '3050AC3CD2AE6F03'
|
||||||
|
gpg -a --export --armor '3050AC3CD2AE6F03' | apt-key add -
|
||||||
|
if [ -f /etc/nginx/conf.d/ee-nginx.conf ]; then
|
||||||
|
mv /etc/nginx/conf.d/ee-nginx.conf /etc/nginx/conf.d/ee-nginx.conf.old &>> /dev/null
|
||||||
|
fi
|
||||||
|
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old &>> /dev/null
|
||||||
|
apt-get update
|
||||||
|
service nginx stop &>> /dev/null
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confold" -y install nginx-custom nginx-ee
|
||||||
|
service nginx restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
dpkg --get-selections | grep -v deinstall | grep nginx-common
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
apt-get update
|
||||||
|
dpkg --get-selections | grep -v deinstall | grep nginx-mainline
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
apt-get remove -y nginx-mainline
|
||||||
|
fi
|
||||||
|
service nginx stop &>> /dev/null
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confold" -y --allow-unauthenticated install nginx-ee nginx-custom
|
||||||
|
service nginx restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ "$wo_distro_version" == "wheezy" ]; then
|
||||||
|
grep -Hr 'http://download.opensuse.org/repositories/home:/rtCamp:/EasyEngine/Debian_7.0/ /' /etc/apt/sources.list.d/ &>> /dev/null
|
||||||
|
#grep -Hr "deb http://packages.dotdeb.org wheezy all" /etc/apt/sources.list.d/wo-repo.list &>> /dev/null
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
# if [ -f /etc/apt/sources.list.d/dotdeb-wheezy.list ]; then
|
||||||
|
# rm -rf /etc/apt/sources.list.d/dotdeb-wheezy.list
|
||||||
|
# else
|
||||||
|
# sed -i "/deb http:\/\/packages.dotdeb.org wheezy all/d" /etc/apt/sources.list.d/wo-repo.list &>> /dev/null
|
||||||
|
# fi
|
||||||
|
echo -e "deb http://download.opensuse.org/repositories/home:/rtCamp:/EasyEngine/Debian_7.0/ /" >> /etc/apt/sources.list.d/wo-repo.list
|
||||||
|
gpg --keyserver "hkp://pgp.mit.edu" --recv-keys '3050AC3CD2AE6F03'
|
||||||
|
gpg -a --export --armor '3050AC3CD2AE6F03' | apt-key add -
|
||||||
|
if [ -f /etc/nginx/conf.d/wo-nginx.conf ]; then
|
||||||
|
mv /etc/nginx/conf.d/wo-nginx.conf /etc/nginx/conf.d/wo-nginx.conf.old &>> /dev/null
|
||||||
|
fi
|
||||||
|
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old &>> /dev/null
|
||||||
|
mv /etc/nginx/fastcgi_params /etc/nginx/fastcgi_params.old &>> /dev/null
|
||||||
|
apt-get update
|
||||||
|
service nginx stop &>> /dev/null
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confold" -y install nginx-custom
|
||||||
|
service nginx restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
dpkg --get-selections | grep -v deinstall | grep nginx-common
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
apt-get update
|
||||||
|
service nginx stop &>> /dev/null
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confold" -y install nginx-ee nginx-custom
|
||||||
|
service nginx restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
elif [ "$wo_distro_version" == "jessie" ]; then
|
||||||
|
|
||||||
|
grep -Hr 'http://download.opensuse.org/repositories/home:/rtCamp:/EasyEngine/Debian_8.0/ /' /etc/apt/sources.list.d/ &>> /dev/null
|
||||||
|
#grep -Hr "deb http://packages.dotdeb.org jessie all" /etc/apt/sources.list.d/wo-repo.list &>> /dev/null
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
#sed -i "/deb http:\/\/packages.dotdeb.org jessie all/d" /etc/apt/sources.list.d/wo-repo.list &>> /dev/null
|
||||||
|
echo -e "deb http://download.opensuse.org/repositories/home:/rtCamp:/EasyEngine/Debian_8.0/ /" >> /etc/apt/sources.list.d/wo-repo.list
|
||||||
|
gpg --keyserver "hkp://pgp.mit.edu" --recv-keys '3050AC3CD2AE6F03'
|
||||||
|
gpg -a --export --armor '3050AC3CD2AE6F03' | apt-key add -
|
||||||
|
if [ -f /etc/nginx/conf.d/ee-nginx.conf ]; then
|
||||||
|
mv /etc/nginx/conf.d/ee-nginx.conf /etc/nginx/conf.d/ee-nginx.conf.old &>> /dev/null
|
||||||
|
fi
|
||||||
|
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old &>> /dev/null
|
||||||
|
mv /etc/nginx/fastcgi_params /etc/nginx/fastcgi_params.old &>> /dev/null
|
||||||
|
apt-get update
|
||||||
|
service nginx stop &>> /dev/null
|
||||||
|
apt-get -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confold" -y install nginx-custom
|
||||||
|
service nginx restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
dpkg --get-selections | grep -v deinstall | grep nginx-common
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
apt-get update
|
||||||
|
dpkg --get-selections | grep -v deinstall | grep nginx-mainline
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
apt-get remove -y nginx-mainline
|
||||||
|
fi
|
||||||
|
service nginx stop &>> /dev/null
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confold" -y --allow-unauthenticated install nginx-ee nginx-custom
|
||||||
|
service nginx restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f /etc/nginx/nginx.conf ]; then
|
||||||
|
sed -i "s/.*X-Powered-By.*/\tadd_header X-Powered-By \"WordOps $wo_version_new\";/" /etc/nginx/nginx.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f /etc/nginx/conf.d/wo-plus.conf ]; then
|
||||||
|
sed -i "s/.*X-Powered-By.*/\tadd_header X-Powered-By \"WordOps $wo_version_new\";/" /etc/nginx/conf.d/wo-plus.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Disable Xdebug on old systems if and only if wo debug is off
|
||||||
|
if [ -f /etc/php5/mods-available/xdebug.ini ]; then
|
||||||
|
wo_debug_value=$(grep -Hr 9001 /etc/nginx/conf.d/upstream.conf | wc -l )
|
||||||
|
if [ $wo_debug_value -eq 1 ]; then
|
||||||
|
grep -Hr ";zend_extension" /etc/php5/mods-available/xdebug.ini &>> /dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
sed -i "s/zend_extension/;zend_extension/" /etc/php5/mods-available/xdebug.ini
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fix HHVM autostart on reboot
|
||||||
|
dpkg --get-selections | grep -v deinstall | grep hhvm &>> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
update-rc.d hhvm defaults &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fix WordPress example.html issue
|
||||||
|
# Ref: http://wptavern.com/xss-vulnerability-in-jetpack-and-the-twenty-fifteen-default-theme-affects-millions-of-wordpress-users
|
||||||
|
dpkg --get-selections | grep -v deinstall | grep nginx &>> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
cp /usr/lib/wo/templates/locations.mustache /etc/nginx/common/locations.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fix HHVM upstream issue that was preventing from using EasyEngine for site operations
|
||||||
|
if [ -f /etc/nginx/conf.d/upstream.conf ]; then
|
||||||
|
grep -Hr hhvm /etc/nginx/conf.d/upstream.conf &>> /dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "upstream hhvm {\n# HHVM Pool\nserver 127.0.0.1:8000;\nserver 127.0.0.1:9000 backup;\n}\n" >> /etc/nginx/conf.d/upstream.conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fix HHVM server IP
|
||||||
|
if [ -f /etc/hhvm/server.ini ]; then
|
||||||
|
grep -Hr "hhvm.server.ip" /etc/hhvm/server.ini &>> /dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "hhvm.server.ip = 127.0.0.1\n" >> /etc/hhvm/server.ini
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Rename Redis Header
|
||||||
|
if [ -f /etc/nginx/common/redis-hhvm.conf ]; then
|
||||||
|
sed -i "s/X-Cache /X-SRCache-Fetch-Status /g" /etc/nginx/common/redis-hhvm.conf &>> /dev/null
|
||||||
|
sed -i "s/X-Cache-2 /X-SRCache-Store-Status /g" /etc/nginx/common/redis-hhvm.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f /etc/nginx/common/redis.conf ]; then
|
||||||
|
sed -i "s/X-Cache /X-SRCache-Fetch-Status /g" /etc/nginx/common/redis.conf &>> /dev/null
|
||||||
|
sed -i "s/X-Cache-2 /X-SRCache-Store-Status /g" /etc/nginx/common/redis.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ -f /etc/nginx/common/redis-hhvm.conf ]; then
|
||||||
|
# Update Timeout redis-hhvm.conf
|
||||||
|
grep -0 'redis2_query expire $key 6h' /etc/nginx/common/redis-hhvm.conf &>> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
sed -i 's/redis2_query expire $key 6h/redis2_query expire $key 14400/g' /etc/nginx/common/redis-hhvm.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Fix for 3.3.4 redis-hhvm issue
|
||||||
|
grep -0 'HTTP_ACCEPT_ENCODING' /etc/nginx/common/redis-hhvm.conf &>> /dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
sed -i 's/fastcgi_params;/fastcgi_params;\n fastcgi_param HTTP_ACCEPT_ENCODING "";/g' /etc/nginx/common/redis-hhvm.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Fix Security Issue. commit #c64f28e
|
||||||
|
if [ -f /etc/nginx/common/locations.conf ]; then
|
||||||
|
grep -0 '$request_uri ~\* \"^.+(readme|license|example)\\.(txt|html)$\"' /etc/nginx/common/locations.conf &>> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
sed -i 's/$request_uri ~\* \"^.+(readme|license|example)\\.(txt|html)$\"/$uri ~\* \"^.+(readme|license|example)\\.(txt|html)$\"/g' /etc/nginx/common/locations.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Fix Redis-server security issue
|
||||||
|
#http://redis.io/topics/security
|
||||||
|
if [ -f /etc/redis/redis.conf ]; then
|
||||||
|
grep -0 -v "#" /etc/redis/redis.conf | grep 'bind' &>> /dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
sed -i '$ a bind 127.0.0.1' /etc/redis/redis.conf &>> /dev/null
|
||||||
|
service redis-server restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Fix For --letsencrypt
|
||||||
|
if [ -f /etc/nginx/common/locations.conf ]; then
|
||||||
|
grep -0 'location ~ \/\\.well-known' /etc/nginx/common/locations.conf &>> /dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
sed -i 's/# Deny hidden files/# Deny hidden files\nlocation ~ \/\\.well-known {\n allow all;\n}\n /g' /etc/nginx/common/locations.conf &>> /dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fix for 3.3.2 renamed nginx.conf
|
||||||
|
nginx -V 2>&1 &>>/dev/null
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
nginx -t 2>&1 | grep 'open() "/etc/nginx/nginx.conf" failed' &>>/dev/null
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
if [ -f /etc/nginx/nginx.conf.old ]; then
|
||||||
|
if [ ! -f /etc/nginx/nginx.conf ]; then
|
||||||
|
cp /etc/nginx/nginx.conf.old /etc/nginx/nginx.conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
# Fix for 3.3.2 renamed fastcgi_param
|
||||||
|
nginx -t 2>&1 | grep 'open() "/etc/nginx/fastcgi_params" failed' &>>/dev/null
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
if [ -f /etc/nginx/fastcgi_params.old ]; then
|
||||||
|
if [ ! -f /etc/nginx/fastcgi_params ]; then
|
||||||
|
cp /etc/nginx/fastcgi_params.old /etc/nginx/fastcgi_params
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Fix For ssl_ciphers
|
||||||
|
if [ -f /etc/nginx/nginx.conf ]; then
|
||||||
|
sed -i 's/HIGH:!aNULL:!MD5:!kEDH;/ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;/' /etc/nginx/nginx.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Fix for SSL cert --all
|
||||||
|
crontab -l | grep -q '\-\-min_expiry_limit'
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
crontab -l > /var/spool/cron/cron-backup.txt #backup cron before editing
|
||||||
|
crontab -l | sed '/--min_expiry_limit/d' | crontab -
|
||||||
|
/bin/bash -c "crontab -l 2> /dev/null | { cat; echo -e \"\n0 0 * * 0 wo site update --le=renew --all 2> /dev/null # Renew all letsencrypt SSL cert. Set by EasyEngine\"; } | crontab -"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Do git intialisation
|
||||||
|
function wo_git_init()
|
||||||
|
{
|
||||||
|
# Nginx under git version control
|
||||||
|
if [ -d /etc/nginx ];then
|
||||||
|
cd /etc/nginx
|
||||||
|
if [ ! -d /etc/nginx/.git ]; then
|
||||||
|
git init &>> /dev/null
|
||||||
|
fi
|
||||||
|
git add -A .
|
||||||
|
git commit -am "Updated Nginx" > /dev/null
|
||||||
|
fi
|
||||||
|
# EasyEngine under git version control
|
||||||
|
cd /etc/wo
|
||||||
|
if [ ! -d /etc/wo/.git ]; then
|
||||||
|
git init > /dev/null
|
||||||
|
fi
|
||||||
|
git add -A .
|
||||||
|
git commit -am "Installed/Updated to WordOps" &>> /dev/null
|
||||||
|
|
||||||
|
#PHP under git version control
|
||||||
|
if [ -d /etc/php ];then
|
||||||
|
cd /etc/php
|
||||||
|
if [ ! -d /etc/php/.git ]; then
|
||||||
|
git init &>> /dev/null
|
||||||
|
fi
|
||||||
|
git add -A .
|
||||||
|
git commit -am "Updated PHP" > /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update WordOps
|
||||||
|
if [ -f /usr/local/sbin/easyengine ]; then
|
||||||
|
# Check old EasyEngine version
|
||||||
|
ee version | grep ${wo_version_old} &>> /dev/null
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
wo_lib_echo "WordOps/EasyEngine $wo_version_old not found on your system" | tee -ai $wo_install_log
|
||||||
|
wo_lib_echo "Updating your EasyEngine to $wo_version_old for compability" | tee -ai $wo_install_log
|
||||||
|
wget -q https://raw.githubusercontent.com/EasyEngine/easyengine/old-stable/bin/update && bash update
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
wo_lib_echo_fail "Unable to update EasyEngine to $wo_version_old, exit status = " $?
|
||||||
|
exit 100
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
read -p "Update WordOps to $wo_version_new (y/n): " wo_ans
|
||||||
|
if [ "$wo_ans" = "y" ] || [ "$wo_ans" = "Y" ]; then
|
||||||
|
wo_install_dep | tee -ai $wo_install_log
|
||||||
|
wo_sync_db 2&>>1 $WO_INSTALL_LOG
|
||||||
|
secure_wo_db | tee -ai $WO_INSTALL_LOG
|
||||||
|
wo_upgrade_php | tee -ai $wo_install_log
|
||||||
|
wo_install | tee -ai $wo_install_log
|
||||||
|
wo_update | tee -ai $wo_install_log
|
||||||
|
wo_update_latest | tee -ai $wo_install_log
|
||||||
|
wo_git_init | tee -ai $wo_install_log
|
||||||
|
else
|
||||||
|
wo_lib_error "Not updating WordOps to $wo_version_new, exit status = " 1
|
||||||
|
fi
|
||||||
|
elif [ ! -f /usr/local/bin/wo ]; then
|
||||||
|
wo_lib_echo "Installing depedencies" | tee -ai $wo_install_log
|
||||||
|
wo_install_dep | tee -ai $wo_install_log
|
||||||
|
wo_lib_echo "Installing WordOps $wo_branch" | tee -ai $wo_install_log
|
||||||
|
wo_install | tee -ai $wo_install_log
|
||||||
|
wo_lib_echo "Running post-install steps" | tee -ai $wo_install_log
|
||||||
|
secure_wo_db | tee -ai $WO_INSTALL_LOG
|
||||||
|
wo_git_init | tee -ai $wo_install_log
|
||||||
|
|
||||||
|
else
|
||||||
|
wo -v 2>&1 | grep $wo_version_new &>> /dev/null
|
||||||
|
if [[ $? -ne 0 ]];then
|
||||||
|
read -p "Update WordOps to $wo_version_new (y/n): " wo_ans
|
||||||
|
if [ "$wo_ans" = "y" ] || [ "$wo_ans" = "Y" ]; then
|
||||||
|
wo_install_dep | tee -ai $wo_install_log
|
||||||
|
wo_sync_db 2&>>1 $WO_INSTALL_LOG
|
||||||
|
secure_wo_db | tee -ai $WO_INSTALL_LOG
|
||||||
|
wo_upgrade_php | tee -ai $wo_install_log
|
||||||
|
wo_install | tee -ai $wo_install_log
|
||||||
|
wo_update_latest | tee -ai $wo_install_log
|
||||||
|
wo_git_init | tee -ai $wo_install_log
|
||||||
|
service nginx reload &>> /dev/null
|
||||||
|
if [ "$wo_distro_version" == "trusty" ]; then
|
||||||
|
service php5.6-fpm restart &>> /dev/null
|
||||||
|
else
|
||||||
|
service php5-fpm restart &>> /dev/null
|
||||||
|
fi
|
||||||
|
wo_update_wp_cli | tee -ai $wo_install_log
|
||||||
|
else
|
||||||
|
wo_lib_error "Not updating WordOps to $wo_version_new, exit status = " 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
wo_lib_error "You already have WordOps $wo_version_new, exit status = " 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
wo sync | tee -ai $WO_INSTALL_LOG
|
||||||
|
|
||||||
|
echo
|
||||||
|
wo_lib_echo "For WordOps (wo) auto completion, run the following command"
|
||||||
|
echo
|
||||||
|
wo_lib_echo_info "source /etc/bash_completion.d/wo_auto.rc"
|
||||||
|
echo
|
||||||
|
wo_lib_echo "Yay! WordOps (wo) installed/updated successfully"
|
||||||
|
wo_lib_echo "WordOps (wo) help: https://wordops.org/docs"
|
||||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
cement>=2.4.0
|
||||||
9
setup.cfg
Normal file
9
setup.cfg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
[nosetests]
|
||||||
|
verbosity=3
|
||||||
|
debug=0
|
||||||
|
detailed-errors=1
|
||||||
|
with-coverage=1
|
||||||
|
cover-package=wo
|
||||||
|
cover-erase=1
|
||||||
|
cover-html=1
|
||||||
|
cover-html-dir=coverage_report/
|
||||||
103
setup.py
Normal file
103
setup.py
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
import configparser
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
conf = []
|
||||||
|
templates = []
|
||||||
|
|
||||||
|
long_description = '''WordOps is the commandline tool to manage your
|
||||||
|
Websites based on WordPress and Nginx with easy to use
|
||||||
|
commands'''
|
||||||
|
|
||||||
|
for name in glob.glob('config/plugins.d/*.conf'):
|
||||||
|
conf.insert(1, name)
|
||||||
|
|
||||||
|
for name in glob.glob('wo/cli/templates/*.mustache'):
|
||||||
|
templates.insert(1, name)
|
||||||
|
|
||||||
|
if not os.path.exists('/var/log/wo/'):
|
||||||
|
os.makedirs('/var/log/wo/')
|
||||||
|
|
||||||
|
if not os.path.exists('/var/lib/wo/'):
|
||||||
|
os.makedirs('/var/lib/wo/')
|
||||||
|
|
||||||
|
# WordOps git configuration management
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read(os.path.expanduser("~")+'/.gitconfig')
|
||||||
|
try:
|
||||||
|
wo_user = config['user']['name']
|
||||||
|
wo_email = config['user']['email']
|
||||||
|
except Exception as e:
|
||||||
|
print("WordOps (wo) required your name & email address to track"
|
||||||
|
" changes you made under the Git version control")
|
||||||
|
print("WordOps (wo) will be able to send you daily reports & alerts in "
|
||||||
|
"upcoming version")
|
||||||
|
print("WordOps (wo) will NEVER share your information with other parties")
|
||||||
|
|
||||||
|
wo_user = input("Enter your name: ")
|
||||||
|
while wo_user is "":
|
||||||
|
print("Unfortunately, this can't be left blank")
|
||||||
|
wo_user = input("Enter your name: ")
|
||||||
|
|
||||||
|
wo_email = input("Enter your email: ")
|
||||||
|
|
||||||
|
while not re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*$",
|
||||||
|
wo_email):
|
||||||
|
print("Whoops, seems like you made a typo - the e-mailaddress is invalid...")
|
||||||
|
wo_email = input("Enter your email: ")
|
||||||
|
|
||||||
|
os.system("git config --global user.name {0}".format(wo_user))
|
||||||
|
os.system("git config --global user.email {0}".format(wo_email))
|
||||||
|
|
||||||
|
if not os.path.isfile('/root/.gitconfig'):
|
||||||
|
shutil.copy2(os.path.expanduser("~")+'/.gitconfig', '/root/.gitconfig')
|
||||||
|
|
||||||
|
setup(name='wo',
|
||||||
|
version='3.8.1',
|
||||||
|
description=long_description,
|
||||||
|
long_description=long_description,
|
||||||
|
classifiers=[],
|
||||||
|
keywords='',
|
||||||
|
author='WordOps',
|
||||||
|
author_email='core@wordops.org',
|
||||||
|
url='https://wordops.io',
|
||||||
|
license='MIT',
|
||||||
|
packages=find_packages(exclude=['ez_setup', 'examples', 'tests',
|
||||||
|
'templates']),
|
||||||
|
include_package_data=True,
|
||||||
|
zip_safe=False,
|
||||||
|
test_suite='nose.collector',
|
||||||
|
install_requires=[
|
||||||
|
# Required to build documentation
|
||||||
|
# "Sphinx >= 1.0",
|
||||||
|
# Required for testing
|
||||||
|
# "nose",
|
||||||
|
# "coverage",
|
||||||
|
# Required to function
|
||||||
|
'cement == 2.4',
|
||||||
|
'pystache',
|
||||||
|
'python-apt',
|
||||||
|
'pynginxconfig',
|
||||||
|
'PyMySQL == 0.8.0',
|
||||||
|
'psutil == 3.1.1',
|
||||||
|
'sh',
|
||||||
|
'SQLAlchemy',
|
||||||
|
],
|
||||||
|
data_files=[('/etc/wo', ['config/wo.conf']),
|
||||||
|
('/etc/wo/plugins.d', conf),
|
||||||
|
('/usr/lib/wo/templates', templates),
|
||||||
|
('/etc/bash_completion.d/',
|
||||||
|
['config/bash_completion.d/wo_auto.rc']),
|
||||||
|
('/usr/share/man/man8/', ['docs/wo.8'])],
|
||||||
|
setup_requires=[],
|
||||||
|
entry_points="""
|
||||||
|
[console_scripts]
|
||||||
|
wo = wo.cli.main:main
|
||||||
|
""",
|
||||||
|
namespace_packages=[],
|
||||||
|
)
|
||||||
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
64
tests/cli/13_test_stack.py
Normal file
64
tests/cli/13_test_stack.py
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseStack(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_web(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--web'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_admin(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--admin'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_php(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_wpcli(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--wpcli'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_phpmyadmin(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--phpmyadmin'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_adminer(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--adminer'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_utils(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'install', '--utils'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
40
tests/cli/2_test_stack_services_start.py
Normal file
40
tests/cli/2_test_stack_services_start.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseStack(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_start_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'start', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_start_php5_fpm(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'start', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_start_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'start', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_start_memcached(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'start', '--memcache'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_start_all(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'start'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
40
tests/cli/3_test_stack_services_status.py
Normal file
40
tests/cli/3_test_stack_services_status.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseStack(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_status_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'status', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_status_php5_fpm(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'status', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_status_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'status', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_status_memcached(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'status', '--memcache'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_status_all(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'status'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
40
tests/cli/4_test_stack_services_stop.py
Normal file
40
tests/cli/4_test_stack_services_stop.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseStack(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_stop_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'stop', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_stop_php5_fpm(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'stop', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_stop_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'stop', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_stop_memcached(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'stop', '--memcache'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_stop_all(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'stop'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
40
tests/cli/5_test_stack_services_restart.py
Normal file
40
tests/cli/5_test_stack_services_restart.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseStack(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_restart_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'restart', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_restart_php5_fpm(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'restart', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_restart_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'restart', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_restart_memcached(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'restart', '--memcache'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_services_restart_all(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'restart'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
66
tests/cli/8_test_site_create.py
Normal file
66
tests/cli/8_test_site_create.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSite(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_create_html(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'create', 'example1.com',
|
||||||
|
'--html'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_create_php(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'create', 'example2.com',
|
||||||
|
'--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_create_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'create', 'example3.com',
|
||||||
|
'--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_create_wp(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'create', 'example4.com',
|
||||||
|
'--wp'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_create_wpsubdir(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'create', 'example5.com',
|
||||||
|
'--wpsubdir'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_create_wpsubdomain(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'create', 'example6.com',
|
||||||
|
'--wpsubdomain'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_create_wpfc(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'create', 'example8.com',
|
||||||
|
'--wpfc'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_create_wpsc(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'create', 'example9.com',
|
||||||
|
'--wpsc'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
16
tests/cli/91_test_site_info.py
Normal file
16
tests/cli/91_test_site_info.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSite(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_info(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'info', 'example1.com'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
22
tests/cli/93_test_site_list.py
Normal file
22
tests/cli/93_test_site_list.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSite(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_list_enable(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'list', '--enabled'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_list_disable(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'list', '--disabled'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
16
tests/cli/95_test_site_show.py
Normal file
16
tests/cli/95_test_site_show.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSite(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_show_edit(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'show', 'example1.com'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
66
tests/cli/97_test_site_update.py
Normal file
66
tests/cli/97_test_site_update.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSite(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_update_html(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'update', 'example2.com',
|
||||||
|
'--html'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_update_php(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'update', 'example1.com',
|
||||||
|
'--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_update_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'update', 'example1.com',
|
||||||
|
'--html'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_update_wp(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'update', 'example5.com',
|
||||||
|
'--wp'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_update_wpsubdir(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'update', 'example4.com',
|
||||||
|
'--wpsubdir'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_update_wpsubdomain(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'update', 'example7.com',
|
||||||
|
'--wpsubdomain'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_update_wpfc(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'update', 'example9.com',
|
||||||
|
'--wpfc'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_update_wpsc(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'update', 'example6.com',
|
||||||
|
'--wpsc'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
16
tests/cli/9_test_site_enable.py
Normal file
16
tests/cli/9_test_site_enable.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSite(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_enable(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'enable', 'example2.com'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
0
tests/cli/__init__.py
Normal file
0
tests/cli/__init__.py
Normal file
16
tests/cli/a_test_site_disable.py
Normal file
16
tests/cli/a_test_site_disable.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSite(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_disable(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'disable', 'example2.com'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
0
tests/cli/ext/__init__.py
Normal file
0
tests/cli/ext/__init__.py
Normal file
0
tests/cli/plugins/__init__.py
Normal file
0
tests/cli/plugins/__init__.py
Normal file
8
tests/cli/plugins/test_example.py
Normal file
8
tests/cli/plugins/test_example.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
"""Tests for Example Plugin."""
|
||||||
|
|
||||||
|
from wo.utils import test
|
||||||
|
|
||||||
|
class ExamplePluginTestCase(test.WOTestCase):
|
||||||
|
def test_load_example_plugin(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.plugin.load_plugin('example')
|
||||||
40
tests/cli/test_clean.py
Normal file
40
tests/cli/test_clean.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseClean(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_clean(self):
|
||||||
|
self.app = get_test_app(argv=['clean'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_clean_fastcgi(self):
|
||||||
|
self.app = get_test_app(argv=['clean', '--fastcgi'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_clean_all(self):
|
||||||
|
self.app = get_test_app(argv=['clean', '--all'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_clean_memcache(self):
|
||||||
|
self.app = get_test_app(argv=['clean', '--memcache'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_clean_opcache(self):
|
||||||
|
self.app = get_test_app(argv=['clean', '--opcache'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
95
tests/cli/test_debug.py
Normal file
95
tests/cli/test_debug.py
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseDebug(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_stop(self):
|
||||||
|
self.app = get_test_app(argv=['debug', '--stop'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_start(self):
|
||||||
|
self.app = get_test_app(argv=['debug', '--start'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_php(self):
|
||||||
|
self.app = get_test_app(argv=['debug', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['debug', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_rewrite(self):
|
||||||
|
self.app = get_test_app(argv=['debug', '--rewrite'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_fpm(self):
|
||||||
|
self.app = get_test_app(argv=['debug', '--fpm'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['debug', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_import_slow_log_interval(self):
|
||||||
|
self.app = get_test_app(argv=['debug', '--mysql',
|
||||||
|
'--import-slow-log-interval'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_site_name_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['debug', 'example3.com', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_site_name_wp(self):
|
||||||
|
self.app = get_test_app(argv=['debug', 'example4.com', '--wp'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_site_name_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['debug', 'example4.com', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_site_name_start(self):
|
||||||
|
self.app = get_test_app(argv=['debug', 'example1.com', '--start'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_site_name_stop(self):
|
||||||
|
self.app = get_test_app(argv=['debug', 'example1.com', '--stop'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_debug_site_name_rewrite(self):
|
||||||
|
self.app = get_test_app(argv=['debug', 'example1.com', '--rewrite'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
28
tests/cli/test_info.py
Normal file
28
tests/cli/test_info.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseInfo(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_info_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['info', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_info_php(self):
|
||||||
|
self.app = get_test_app(argv=['info', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_info_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['info', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
28
tests/cli/test_secure.py
Normal file
28
tests/cli/test_secure.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSecure(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_secure_auth(self):
|
||||||
|
self.app = get_test_app(argv=['secure', '--auth'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_secure_port(self):
|
||||||
|
self.app = get_test_app(argv=['secure', '--port'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_secure_ip(self):
|
||||||
|
self.app = get_test_app(argv=['secure', '--ip'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
38
tests/cli/test_site_delete.py
Normal file
38
tests/cli/test_site_delete.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseSite(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_detele(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'delete', 'example1.com',
|
||||||
|
'--no-prompt'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_detele_all(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'delete', 'example2.com',
|
||||||
|
'--all', '--no-prompt'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_detele_db(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'delete', 'example3.com',
|
||||||
|
'--db', '--no-prompt'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_site_detele_files(self):
|
||||||
|
self.app = get_test_app(argv=['site', 'delete', 'example4.com',
|
||||||
|
'--files', '--no-prompt'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
64
tests/cli/test_stack_purge.py
Normal file
64
tests/cli/test_stack_purge.py
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseStack(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_web(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--web'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_admin(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--admin'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_php(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_wpcli(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--wpcli'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_phpmyadmin(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--phpmyadmin'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_adminer(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--adminer'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_purge_utils(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'purge', '--utils'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
64
tests/cli/test_stack_remove.py
Normal file
64
tests/cli/test_stack_remove.py
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
from wo.utils import test
|
||||||
|
from wo.cli.main import get_test_app
|
||||||
|
|
||||||
|
|
||||||
|
class CliTestCaseStack(test.WOTestCase):
|
||||||
|
|
||||||
|
def test_wo_cli(self):
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_remove_web(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--web'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_admin(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--admin'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_nginx(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--nginx'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_php(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--php'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_mysql(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--mysql'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_wpcli(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--wpcli'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_phpmyadmin(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--phpmyadmin'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_adminer(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--adminer'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
|
|
||||||
|
def test_wo_cli_stack_install_utils(self):
|
||||||
|
self.app = get_test_app(argv=['stack', 'remove', '--utils'])
|
||||||
|
self.app.setup()
|
||||||
|
self.app.run()
|
||||||
|
self.app.close()
|
||||||
0
tests/core/__init__.py
Normal file
0
tests/core/__init__.py
Normal file
1
wo/__init__.py
Normal file
1
wo/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
__import__('pkg_resources').declare_namespace(__name__)
|
||||||
0
wo/cli/__init__.py
Normal file
0
wo/cli/__init__.py
Normal file
11
wo/cli/bootstrap.py
Normal file
11
wo/cli/bootstrap.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
"""WordOps bootstrapping."""
|
||||||
|
|
||||||
|
# All built-in application controllers should be imported, and registered
|
||||||
|
# in this file in the same way as WOBaseController.
|
||||||
|
|
||||||
|
from cement.core import handler
|
||||||
|
from wo.cli.controllers.base import WOBaseController
|
||||||
|
|
||||||
|
|
||||||
|
def load(app):
|
||||||
|
handler.register(WOBaseController)
|
||||||
0
wo/cli/controllers/__init__.py
Normal file
0
wo/cli/controllers/__init__.py
Normal file
25
wo/cli/controllers/base.py
Normal file
25
wo/cli/controllers/base.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
"""WordOps base controller."""
|
||||||
|
|
||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from wo.core.variables import WOVariables
|
||||||
|
VERSION = WOVariables.wo_version
|
||||||
|
|
||||||
|
BANNER = """
|
||||||
|
WordOps v%s
|
||||||
|
Copyright (c) 2018 WordOps.
|
||||||
|
""" % VERSION
|
||||||
|
|
||||||
|
|
||||||
|
class WOBaseController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'base'
|
||||||
|
description = ("WordOps is the commandline tool to manage your"
|
||||||
|
" websites based on WordPress and Nginx with easy to"
|
||||||
|
" use commands")
|
||||||
|
arguments = [
|
||||||
|
(['-v', '--version'], dict(action='version', version=BANNER)),
|
||||||
|
]
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
self.app.args.print_help()
|
||||||
0
wo/cli/ext/__init__.py
Normal file
0
wo/cli/ext/__init__.py
Normal file
20
wo/cli/ext/wo_outputhandler.py
Normal file
20
wo/cli/ext/wo_outputhandler.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Based on https://github.com/datafolklabs/cement/issues/295
|
||||||
|
# To avoid encoding releated error,we defined our custom output handler
|
||||||
|
# I hope we will remove this when we upgarde to Cement 2.6 (Not released yet)
|
||||||
|
import os
|
||||||
|
from cement.utils import fs
|
||||||
|
from cement.ext.ext_mustache import MustacheOutputHandler
|
||||||
|
|
||||||
|
|
||||||
|
class WOOutputHandler(MustacheOutputHandler):
|
||||||
|
class Meta:
|
||||||
|
label = 'wo_output_handler'
|
||||||
|
|
||||||
|
def _load_template_from_file(self, path):
|
||||||
|
for templ_dir in self.app._meta.template_dirs:
|
||||||
|
full_path = fs.abspath(os.path.join(templ_dir, path))
|
||||||
|
if os.path.exists(full_path):
|
||||||
|
self.app.log.debug('loading template file %s' % full_path)
|
||||||
|
return open(full_path, encoding='utf-8', mode='r').read()
|
||||||
|
else:
|
||||||
|
continue
|
||||||
135
wo/cli/main.py
Normal file
135
wo/cli/main.py
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
"""WordOps main application entry point."""
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
# this has to happen after you import sys, but before you import anything
|
||||||
|
# from Cement "source: https://github.com/datafolklabs/cement/issues/290"
|
||||||
|
if '--debug' in sys.argv:
|
||||||
|
sys.argv.remove('--debug')
|
||||||
|
TOGGLE_DEBUG = True
|
||||||
|
else:
|
||||||
|
TOGGLE_DEBUG = False
|
||||||
|
|
||||||
|
from cement.core import foundation
|
||||||
|
from cement.utils.misc import init_defaults
|
||||||
|
from cement.core.exc import FrameworkError, CaughtSignal
|
||||||
|
from cement.ext.ext_argparse import ArgParseArgumentHandler
|
||||||
|
from wo.core import exc
|
||||||
|
from wo.cli.ext.wo_outputhandler import WOOutputHandler
|
||||||
|
|
||||||
|
# Application default. Should update config/wo.conf to reflect any
|
||||||
|
# changes, or additions here.
|
||||||
|
defaults = init_defaults('wo')
|
||||||
|
|
||||||
|
# All internal/external plugin configurations are loaded from here
|
||||||
|
defaults['wo']['plugin_config_dir'] = '/etc/wo/plugins.d'
|
||||||
|
|
||||||
|
# External plugins (generally, do not ship with application code)
|
||||||
|
defaults['wo']['plugin_dir'] = '/var/lib/wo/plugins'
|
||||||
|
|
||||||
|
# External templates (generally, do not ship with application code)
|
||||||
|
defaults['wo']['template_dir'] = '/var/lib/wo/templates'
|
||||||
|
|
||||||
|
|
||||||
|
class WOArgHandler(ArgParseArgumentHandler):
|
||||||
|
class Meta:
|
||||||
|
label = 'wo_args_handler'
|
||||||
|
|
||||||
|
def error(self, message):
|
||||||
|
super(WOArgHandler, self).error("unknown args")
|
||||||
|
|
||||||
|
|
||||||
|
class WOApp(foundation.CementApp):
|
||||||
|
class Meta:
|
||||||
|
label = 'wo'
|
||||||
|
|
||||||
|
config_defaults = defaults
|
||||||
|
|
||||||
|
# All built-in application bootstrapping (always run)
|
||||||
|
bootstrap = 'wo.cli.bootstrap'
|
||||||
|
|
||||||
|
# Optional plugin bootstrapping (only run if plugin is enabled)
|
||||||
|
plugin_bootstrap = 'wo.cli.plugins'
|
||||||
|
|
||||||
|
# Internal templates (ship with application code)
|
||||||
|
template_module = 'wo.cli.templates'
|
||||||
|
|
||||||
|
# Internal plugins (ship with application code)
|
||||||
|
plugin_bootstrap = 'wo.cli.plugins'
|
||||||
|
|
||||||
|
extensions = ['mustache']
|
||||||
|
|
||||||
|
# default output handler
|
||||||
|
output_handler = WOOutputHandler
|
||||||
|
|
||||||
|
arg_handler = WOArgHandler
|
||||||
|
|
||||||
|
debug = TOGGLE_DEBUG
|
||||||
|
|
||||||
|
|
||||||
|
class WOTestApp(WOApp):
|
||||||
|
"""A test app that is better suited for testing."""
|
||||||
|
class Meta:
|
||||||
|
argv = []
|
||||||
|
config_files = []
|
||||||
|
|
||||||
|
|
||||||
|
# Define the applicaiton object outside of main, as some libraries might wish
|
||||||
|
# to import it as a global (rather than passing it into another class/func)
|
||||||
|
app = WOApp()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
try:
|
||||||
|
global sys
|
||||||
|
# Default our exit status to 0 (non-error)
|
||||||
|
code = 0
|
||||||
|
|
||||||
|
# if not root...kick out
|
||||||
|
if not os.geteuid() == 0:
|
||||||
|
print("\nNon-privileged users cant use WordOps. Switch to root or invoke sudo.\n")
|
||||||
|
app.close(1)
|
||||||
|
|
||||||
|
# Setup the application
|
||||||
|
app.setup()
|
||||||
|
|
||||||
|
# Dump all arguments into wo log
|
||||||
|
app.log.debug(sys.argv)
|
||||||
|
|
||||||
|
# Run the application
|
||||||
|
app.run()
|
||||||
|
except exc.WOError as e:
|
||||||
|
# Catch our application errors and exit 1 (error)
|
||||||
|
code = 1
|
||||||
|
print(e)
|
||||||
|
except FrameworkError as e:
|
||||||
|
# Catch framework errors and exit 1 (error)
|
||||||
|
code = 1
|
||||||
|
print(e)
|
||||||
|
except CaughtSignal as e:
|
||||||
|
# Default Cement signals are SIGINT and SIGTERM, exit 0 (non-error)
|
||||||
|
code = 0
|
||||||
|
print(e)
|
||||||
|
except Exception as e:
|
||||||
|
code = 1
|
||||||
|
print(e)
|
||||||
|
finally:
|
||||||
|
# Print an exception (if it occurred) and --debug was passed
|
||||||
|
if app.debug:
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
exc_type, exc_value, exc_traceback = sys.exc_info()
|
||||||
|
if exc_traceback is not None:
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
# # Close the application
|
||||||
|
app.close(code)
|
||||||
|
|
||||||
|
|
||||||
|
def get_test_app(**kw):
|
||||||
|
app = WOApp(**kw)
|
||||||
|
return app
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
0
wo/cli/plugins/__init__.py
Normal file
0
wo/cli/plugins/__init__.py
Normal file
104
wo/cli/plugins/clean.py
Normal file
104
wo/cli/plugins/clean.py
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
"""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 urllib.request
|
||||||
|
|
||||||
|
|
||||||
|
def wo_clean_hook(app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WOCleanController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'clean'
|
||||||
|
stacked_on = 'base'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
description = ('Clean NGINX FastCGI cache, Opcache, Memcache, Redis Cache')
|
||||||
|
arguments = [
|
||||||
|
(['--all'],
|
||||||
|
dict(help='Clean all cache', action='store_true')),
|
||||||
|
(['--fastcgi'],
|
||||||
|
dict(help='Clean FastCGI cache', action='store_true')),
|
||||||
|
(['--memcache'],
|
||||||
|
dict(help='Clean MemCache', action='store_true')),
|
||||||
|
(['--opcache'],
|
||||||
|
dict(help='Clean OpCache', action='store_true')),
|
||||||
|
(['--redis'],
|
||||||
|
dict(help='Clean Redis Cache', action='store_true')),
|
||||||
|
]
|
||||||
|
usage = "wo clean [options]"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
if (not (self.app.pargs.all or self.app.pargs.fastcgi or
|
||||||
|
self.app.pargs.memcache or self.app.pargs.opcache or
|
||||||
|
self.app.pargs.redis)):
|
||||||
|
self.clean_fastcgi()
|
||||||
|
if self.app.pargs.all:
|
||||||
|
self.clean_memcache()
|
||||||
|
self.clean_fastcgi()
|
||||||
|
self.clean_opcache()
|
||||||
|
self.clean_redis()
|
||||||
|
if self.app.pargs.fastcgi:
|
||||||
|
self.clean_fastcgi()
|
||||||
|
if self.app.pargs.memcache:
|
||||||
|
self.clean_memcache()
|
||||||
|
if self.app.pargs.opcache:
|
||||||
|
self.clean_opcache()
|
||||||
|
if self.app.pargs.redis:
|
||||||
|
self.clean_redis()
|
||||||
|
@expose(hide=True)
|
||||||
|
def clean_redis(self):
|
||||||
|
"""This function clears Redis cache"""
|
||||||
|
if(WOAptGet.is_installed(self, "redis-server")):
|
||||||
|
Log.info(self, "Cleaning Redis cache")
|
||||||
|
WOShellExec.cmd_exec(self, "redis-cli flushall")
|
||||||
|
else:
|
||||||
|
Log.info(self, "Redis is not installed")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def clean_memcache(self):
|
||||||
|
try:
|
||||||
|
if(WOAptGet.is_installed(self, "memcached")):
|
||||||
|
WOService.restart_service(self, "memcached")
|
||||||
|
Log.info(self, "Cleaning MemCache")
|
||||||
|
else:
|
||||||
|
Log.info(self, "Memcache not installed")
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.error(self, "Unable to restart Memcached", False)
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def clean_fastcgi(self):
|
||||||
|
if(os.path.isdir("/var/run/nginx-cache")):
|
||||||
|
Log.info(self, "Cleaning NGINX FastCGI cache")
|
||||||
|
WOShellExec.cmd_exec(self, "rm -rf /var/run/nginx-cache/*")
|
||||||
|
else:
|
||||||
|
Log.error(self, "Unable to clean FastCGI cache", False)
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def clean_opcache(self):
|
||||||
|
try:
|
||||||
|
Log.info(self, "Cleaning opcache")
|
||||||
|
wp = urllib.request.urlopen(" https://127.0.0.1:22222/cache"
|
||||||
|
"/opcache/opgui.php?page=reset").read()
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.debug(self, "Unable hit url, "
|
||||||
|
" https://127.0.0.1:22222/cache/opcache/opgui.php?page=reset,"
|
||||||
|
" please check you have admin tools installed")
|
||||||
|
Log.debug(self, "please check you have admin tools installed,"
|
||||||
|
" or install them with `wo stack install --admin`")
|
||||||
|
Log.error(self, "Unable to clean opcache", False)
|
||||||
|
|
||||||
|
def load(app):
|
||||||
|
# register the plugin class.. this only happens if the plugin is enabled
|
||||||
|
handler.register(WOCleanController)
|
||||||
|
# register a hook (function) to run after arguments are parsed.
|
||||||
|
hook.register('post_argument_parsing', wo_clean_hook)
|
||||||
856
wo/cli/plugins/debug.py
Normal file
856
wo/cli/plugins/debug.py
Normal file
@@ -0,0 +1,856 @@
|
|||||||
|
"""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 *
|
||||||
|
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 glob
|
||||||
|
import signal
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
def wo_debug_hook(app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WODebugController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'debug'
|
||||||
|
description = 'Used for server level debugging'
|
||||||
|
stacked_on = 'base'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
arguments = [
|
||||||
|
(['--stop'],
|
||||||
|
dict(help='Stop debug', action='store_true')),
|
||||||
|
(['--start'],
|
||||||
|
dict(help='Start debug', action='store_true')),
|
||||||
|
(['--import-slow-log'],
|
||||||
|
dict(help='Import MySQL slow log to Anemometer database',
|
||||||
|
action='store_true')),
|
||||||
|
(['--nginx'],
|
||||||
|
dict(help='start/stop debugging nginx server '
|
||||||
|
'configuration for site',
|
||||||
|
action='store' or 'store_const',
|
||||||
|
choices=('on', 'off'), const='on', nargs='?')),
|
||||||
|
(['--php'],
|
||||||
|
dict(help='start/stop debugging server PHP configuration',
|
||||||
|
action='store' or 'store_const',
|
||||||
|
choices=('on', 'off'), const='on', nargs='?')),
|
||||||
|
(['--fpm'],
|
||||||
|
dict(help='start/stop debugging fastcgi configuration',
|
||||||
|
action='store' or 'store_const',
|
||||||
|
choices=('on', 'off'), const='on', nargs='?')),
|
||||||
|
(['--php7'],
|
||||||
|
dict(help='start/stop debugging server PHP 7 configuration',
|
||||||
|
action='store' or 'store_const',
|
||||||
|
choices=('on', 'off'), const='on', nargs='?')),
|
||||||
|
(['--fpm7'],
|
||||||
|
dict(help='start/stop debugging fastcgi 7.0 configuration',
|
||||||
|
action='store' or 'store_const',
|
||||||
|
choices=('on', 'off'), const='on', nargs='?')),
|
||||||
|
(['--mysql'],
|
||||||
|
dict(help='start/stop debugging MySQL server',
|
||||||
|
action='store' or 'store_const',
|
||||||
|
choices=('on', 'off'), const='on', nargs='?')),
|
||||||
|
(['--wp'],
|
||||||
|
dict(help='start/stop wordpress debugging for site',
|
||||||
|
action='store' or 'store_const', choices=('on', 'off'),
|
||||||
|
const='on', nargs='?')),
|
||||||
|
(['--rewrite'],
|
||||||
|
dict(help='start/stop debugging nginx rewrite rules for site',
|
||||||
|
action='store' or 'store_const', choices=('on', 'off'),
|
||||||
|
const='on', nargs='?')),
|
||||||
|
(['--all'],
|
||||||
|
dict(help='start/stop debugging all server parameters',
|
||||||
|
action='store' or 'store_const', choices=('on', 'off'),
|
||||||
|
const='on', nargs='?')),
|
||||||
|
(['-i', '--interactive'],
|
||||||
|
dict(help='Interactive debug', action='store_true')),
|
||||||
|
(['--import-slow-log-interval'],
|
||||||
|
dict(help='Import MySQL slow log to Anemometer',
|
||||||
|
action='store', dest='interval')),
|
||||||
|
(['site_name'],
|
||||||
|
dict(help='Website Name', nargs='?', default=None))
|
||||||
|
]
|
||||||
|
usage = "wo debug [<site_name>] [options] "
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def debug_nginx(self):
|
||||||
|
"""Start/Stop Nginx debug"""
|
||||||
|
# start global debug
|
||||||
|
if (self.app.pargs.nginx == 'on' and not self.app.pargs.site_name):
|
||||||
|
try:
|
||||||
|
debug_address = (self.app.config.get('stack', 'ip-address')
|
||||||
|
.split())
|
||||||
|
except Exception as e:
|
||||||
|
debug_address = ['0.0.0.0/0']
|
||||||
|
|
||||||
|
# Check if IP address is 127.0.0.1 then enable debug globally
|
||||||
|
if debug_address == ['127.0.0.1'] or debug_address == []:
|
||||||
|
debug_address = ['0.0.0.0/0']
|
||||||
|
|
||||||
|
for ip_addr in debug_address:
|
||||||
|
if not ("debug_connection "+ip_addr in open('/etc/nginx/'
|
||||||
|
'nginx.conf', encoding='utf-8').read()):
|
||||||
|
Log.info(self, "Setting up Nginx debug connection"
|
||||||
|
" for "+ip_addr)
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"/events {{/a\\ \\ \\ "
|
||||||
|
"\\ $(echo debug_connection "
|
||||||
|
"{ip}\;)\" /etc/nginx/"
|
||||||
|
"nginx.conf".format(ip=ip_addr))
|
||||||
|
self.trigger_nginx = True
|
||||||
|
|
||||||
|
if not self.trigger_nginx:
|
||||||
|
Log.info(self, "Nginx debug connection already enabled")
|
||||||
|
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*.error.log"]
|
||||||
|
|
||||||
|
# stop global debug
|
||||||
|
elif (self.app.pargs.nginx == 'off' and not self.app.pargs.site_name):
|
||||||
|
if "debug_connection " in open('/etc/nginx/nginx.conf',
|
||||||
|
encoding='utf-8').read():
|
||||||
|
Log.info(self, "Disabling Nginx debug connections")
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"/debug_connection.*/d\""
|
||||||
|
" /etc/nginx/nginx.conf")
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx debug connection already disabled")
|
||||||
|
|
||||||
|
# start site specific debug
|
||||||
|
elif (self.app.pargs.nginx == 'on' and self.app.pargs.site_name):
|
||||||
|
config_path = ("/etc/nginx/sites-available/{0}"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
if os.path.isfile(config_path):
|
||||||
|
if not WOShellExec.cmd_exec(self, "grep \"error.log debug\" "
|
||||||
|
"{0}".format(config_path)):
|
||||||
|
Log.info(self, "Starting NGINX debug connection for "
|
||||||
|
"{0}".format(self.app.pargs.site_name))
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"s/error.log;/"
|
||||||
|
"error.log "
|
||||||
|
"debug;/\" {0}".format(config_path))
|
||||||
|
self.trigger_nginx = True
|
||||||
|
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx debug for site already enabled")
|
||||||
|
|
||||||
|
self.msg = self.msg + ['{0}{1}/logs/error.log'
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
|
||||||
|
else:
|
||||||
|
Log.info(self, "{0} domain not valid"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
|
||||||
|
# stop site specific debug
|
||||||
|
elif (self.app.pargs.nginx == 'off' and self.app.pargs.site_name):
|
||||||
|
config_path = ("/etc/nginx/sites-available/{0}"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
if os.path.isfile(config_path):
|
||||||
|
if WOShellExec.cmd_exec(self, "grep \"error.log debug\" {0}"
|
||||||
|
.format(config_path)):
|
||||||
|
Log.info(self, "Stoping NGINX debug connection for {0}"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"s/error.log debug;/"
|
||||||
|
"error.log;/\" {0}"
|
||||||
|
.format(config_path))
|
||||||
|
self.trigger_nginx = True
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
Log.info(self, "Nginx debug for site already disabled")
|
||||||
|
else:
|
||||||
|
Log.info(self, "{0} domain not valid"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def debug_php(self):
|
||||||
|
"""Start/Stop PHP debug"""
|
||||||
|
# PHP global debug start
|
||||||
|
|
||||||
|
if (self.app.pargs.php == 'on' and not self.app.pargs.site_name):
|
||||||
|
if not (WOShellExec.cmd_exec(self, "sed -n \"/upstream php"
|
||||||
|
"{/,/}/p \" /etc/nginx/"
|
||||||
|
"conf.d/upstream.conf "
|
||||||
|
"| grep 9001")):
|
||||||
|
|
||||||
|
Log.info(self, "Enabling PHP debug")
|
||||||
|
|
||||||
|
# Change upstream.conf
|
||||||
|
nc = NginxConfig()
|
||||||
|
nc.loadf('/etc/nginx/conf.d/upstream.conf')
|
||||||
|
nc.set([('upstream','php',), 'server'], '127.0.0.1:9001')
|
||||||
|
if os.path.isfile("/etc/nginx/common/wpfc-hhvm.conf"):
|
||||||
|
nc.set([('upstream','hhvm',), 'server'], '127.0.0.1:9001')
|
||||||
|
nc.savef('/etc/nginx/conf.d/upstream.conf')
|
||||||
|
|
||||||
|
# Enable xdebug
|
||||||
|
WOFileUtils.searchreplace(self, "/etc/{0}/mods-available/".format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5") +
|
||||||
|
"xdebug.ini",
|
||||||
|
";zend_extension",
|
||||||
|
"zend_extension")
|
||||||
|
|
||||||
|
# Fix slow log is not enabled default in PHP5.6
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('/etc/{0}/fpm/pool.d/debug.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
config['debug']['slowlog'] = '/var/log/{0}/slow.log'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5")
|
||||||
|
config['debug']['request_slowlog_timeout'] = '10s'
|
||||||
|
with open('/etc/{0}/fpm/pool.d/debug.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"),
|
||||||
|
encoding='utf-8', mode='w') as confifile:
|
||||||
|
Log.debug(self, "Writting debug.conf configuration into "
|
||||||
|
"/etc/{0}/fpm/pool.d/debug.conf".format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
config.write(confifile)
|
||||||
|
|
||||||
|
self.trigger_php = True
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP debug is already enabled")
|
||||||
|
|
||||||
|
self.msg = self.msg + ['/var/log/{0}/slow.log'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5")]
|
||||||
|
|
||||||
|
# PHP global debug stop
|
||||||
|
elif (self.app.pargs.php == 'off' and not self.app.pargs.site_name):
|
||||||
|
if WOShellExec.cmd_exec(self, " sed -n \"/upstream php {/,/}/p\" "
|
||||||
|
"/etc/nginx/conf.d/upstream.conf "
|
||||||
|
"| grep 9001"):
|
||||||
|
Log.info(self, "Disabling PHP debug")
|
||||||
|
|
||||||
|
# Change upstream.conf
|
||||||
|
nc = NginxConfig()
|
||||||
|
nc.loadf('/etc/nginx/conf.d/upstream.conf')
|
||||||
|
nc.set([('upstream','php',), 'server'], '127.0.0.1:9000')
|
||||||
|
if os.path.isfile("/etc/nginx/common/wpfc-hhvm.conf"):
|
||||||
|
nc.set([('upstream','hhvm',), 'server'], '127.0.0.1:8000')
|
||||||
|
nc.savef('/etc/nginx/conf.d/upstream.conf')
|
||||||
|
|
||||||
|
# Disable xdebug
|
||||||
|
WOFileUtils.searchreplace(self, "/etc/{0}/mods-available/".format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5") +
|
||||||
|
"xdebug.ini",
|
||||||
|
"zend_extension",
|
||||||
|
";zend_extension")
|
||||||
|
|
||||||
|
self.trigger_php = True
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP debug is already disabled")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def debug_fpm(self):
|
||||||
|
"""Start/Stop PHP5-FPM debug"""
|
||||||
|
# PHP5-FPM start global debug
|
||||||
|
if (self.app.pargs.fpm == 'on' and not self.app.pargs.site_name):
|
||||||
|
if not WOShellExec.cmd_exec(self, "grep \"log_level = debug\" "
|
||||||
|
"/etc/{0}/fpm/php-fpm.conf".format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5")):
|
||||||
|
Log.info(self, "Setting up PHP5-FPM log_level = debug")
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('/etc/{0}/fpm/php-fpm.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
config.remove_option('global', 'include')
|
||||||
|
config['global']['log_level'] = 'debug'
|
||||||
|
config['global']['include'] = '/etc/{0}/fpm/pool.d/*.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5")
|
||||||
|
with open('/etc/{0}/fpm/php-fpm.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"),
|
||||||
|
encoding='utf-8', mode='w') as configfile:
|
||||||
|
Log.debug(self, "Writting php5-FPM configuration into "
|
||||||
|
"/etc/{0}/fpm/php-fpm.conf".format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
config.write(configfile)
|
||||||
|
self.trigger_php = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5-FPM log_level = debug already setup")
|
||||||
|
|
||||||
|
self.msg = self.msg + ['/var/log/{0}/fpm.log'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5")]
|
||||||
|
|
||||||
|
# PHP5-FPM stop global debug
|
||||||
|
elif (self.app.pargs.fpm == 'off' and not self.app.pargs.site_name):
|
||||||
|
if WOShellExec.cmd_exec(self, "grep \"log_level = debug\" "
|
||||||
|
"/etc/{0}/fpm/php-fpm.conf".format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5")):
|
||||||
|
Log.info(self, "Disabling PHP5-FPM log_level = debug")
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('/etc/{0}/fpm/php-fpm.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
config.remove_option('global', 'include')
|
||||||
|
config['global']['log_level'] = 'notice'
|
||||||
|
config['global']['include'] = '/etc/{0}/fpm/pool.d/*.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5")
|
||||||
|
with open('/etc/{0}/fpm/php-fpm.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"),
|
||||||
|
encoding='utf-8', mode='w') as configfile:
|
||||||
|
Log.debug(self, "writting php5 configuration into "
|
||||||
|
"/etc/{0}/fpm/php-fpm.conf".format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
config.write(configfile)
|
||||||
|
|
||||||
|
self.trigger_php = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5-FPM log_level = debug already disabled")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def debug_php7(self):
|
||||||
|
"""Start/Stop PHP debug"""
|
||||||
|
# PHP global debug start
|
||||||
|
|
||||||
|
if (self.app.pargs.php7 == 'on' and not self.app.pargs.site_name):
|
||||||
|
if (WOVariables.wo_platform_codename == 'wheezy' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
Log.error(self,"PHP 7.0 not supported.")
|
||||||
|
if not (WOShellExec.cmd_exec(self, "sed -n \"/upstream php7"
|
||||||
|
"{/,/}/p \" /etc/nginx/"
|
||||||
|
"conf.d/upstream.conf "
|
||||||
|
"| grep 9170")):
|
||||||
|
|
||||||
|
Log.info(self, "Enabling PHP 7.0 debug")
|
||||||
|
|
||||||
|
# Change upstream.conf
|
||||||
|
nc = NginxConfig()
|
||||||
|
nc.loadf('/etc/nginx/conf.d/upstream.conf')
|
||||||
|
nc.set([('upstream','php7',), 'server'], '127.0.0.1:9170')
|
||||||
|
if os.path.isfile("/etc/nginx/common/wpfc-hhvm.conf"):
|
||||||
|
nc.set([('upstream','hhvm',), 'server'], '127.0.0.1:9170')
|
||||||
|
nc.savef('/etc/nginx/conf.d/upstream.conf')
|
||||||
|
|
||||||
|
# Enable xdebug
|
||||||
|
WOFileUtils.searchreplace(self, "/etc/php/7.0/mods-available/"
|
||||||
|
"xdebug.ini",
|
||||||
|
";zend_extension",
|
||||||
|
"zend_extension")
|
||||||
|
|
||||||
|
# Fix slow log is not enabled default in PHP5.6
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('/etc/php/7.0/fpm/pool.d/debug.conf')
|
||||||
|
config['debug']['slowlog'] = '/var/log/php/7.0/slow.log'
|
||||||
|
config['debug']['request_slowlog_timeout'] = '10s'
|
||||||
|
with open('/etc/php/7.0/fpm/pool.d/debug.conf',
|
||||||
|
encoding='utf-8', mode='w') as confifile:
|
||||||
|
Log.debug(self, "Writting debug.conf configuration into "
|
||||||
|
"/etc/php/7.0/fpm/pool.d/debug.conf")
|
||||||
|
config.write(confifile)
|
||||||
|
|
||||||
|
self.trigger_php = True
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP debug is already enabled")
|
||||||
|
|
||||||
|
self.msg = self.msg + ['/var/log/php/7.0/slow.log']
|
||||||
|
|
||||||
|
# PHP global debug stop
|
||||||
|
elif (self.app.pargs.php7 == 'off' and not self.app.pargs.site_name):
|
||||||
|
if WOShellExec.cmd_exec(self, " sed -n \"/upstream php7 {/,/}/p\" "
|
||||||
|
"/etc/nginx/conf.d/upstream.conf "
|
||||||
|
"| grep 9170"):
|
||||||
|
Log.info(self, "Disabling PHP 7.0 debug")
|
||||||
|
|
||||||
|
# Change upstream.conf
|
||||||
|
nc = NginxConfig()
|
||||||
|
nc.loadf('/etc/nginx/conf.d/upstream.conf')
|
||||||
|
nc.set([('upstream','php7',), 'server'], '127.0.0.1:9070')
|
||||||
|
if os.path.isfile("/etc/nginx/common/wpfc-hhvm.conf"):
|
||||||
|
nc.set([('upstream','hhvm',), 'server'], '127.0.0.1:8000')
|
||||||
|
nc.savef('/etc/nginx/conf.d/upstream.conf')
|
||||||
|
|
||||||
|
# Disable xdebug
|
||||||
|
WOFileUtils.searchreplace(self, "/etc/php/7.0/mods-available/"
|
||||||
|
"xdebug.ini",
|
||||||
|
"zend_extension",
|
||||||
|
";zend_extension")
|
||||||
|
|
||||||
|
self.trigger_php = True
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP 7.0 debug is already disabled")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def debug_fpm7(self):
|
||||||
|
"""Start/Stop PHP5-FPM debug"""
|
||||||
|
# PHP5-FPM start global debug
|
||||||
|
if (self.app.pargs.fpm7 == 'on' and not self.app.pargs.site_name):
|
||||||
|
if not WOShellExec.cmd_exec(self, "grep \"log_level = debug\" "
|
||||||
|
"/etc/php/7.0/fpm/php-fpm.conf"):
|
||||||
|
Log.info(self, "Setting up PHP7.0-FPM log_level = debug")
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('/etc/php/7.0/fpm/php-fpm.conf')
|
||||||
|
config.remove_option('global', 'include')
|
||||||
|
config['global']['log_level'] = 'debug'
|
||||||
|
config['global']['include'] = '/etc/php/7.0/fpm/pool.d/*.conf'
|
||||||
|
with open('/etc/php/7.0/fpm/php-fpm.conf',
|
||||||
|
encoding='utf-8', mode='w') as configfile:
|
||||||
|
Log.debug(self, "Writting php7.0-FPM configuration into "
|
||||||
|
"/etc/php/7.0/fpm/php-fpm.conf")
|
||||||
|
config.write(configfile)
|
||||||
|
self.trigger_php = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM log_level = debug already setup")
|
||||||
|
|
||||||
|
self.msg = self.msg + ['/var/log/php/7.0/fpm.log']
|
||||||
|
|
||||||
|
# PHP5-FPM stop global debug
|
||||||
|
elif (self.app.pargs.fpm7 == 'off' and not self.app.pargs.site_name):
|
||||||
|
if WOShellExec.cmd_exec(self, "grep \"log_level = debug\" "
|
||||||
|
"/etc/php/7.0/fpm/php-fpm.conf"):
|
||||||
|
Log.info(self, "Disabling PHP7.0-FPM log_level = debug")
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('/etc/php/7.0/fpm/php-fpm.conf')
|
||||||
|
config.remove_option('global', 'include')
|
||||||
|
config['global']['log_level'] = 'notice'
|
||||||
|
config['global']['include'] = '/etc/php/7.0/fpm/pool.d/*.conf'
|
||||||
|
with open('/etc/php/7.0/fpm/php-fpm.conf',
|
||||||
|
encoding='utf-8', mode='w') as configfile:
|
||||||
|
Log.debug(self, "writting php7.0 configuration into "
|
||||||
|
"/etc/php/7.0/fpm/php-fpm.conf")
|
||||||
|
config.write(configfile)
|
||||||
|
self.trigger_php = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM log_level = debug already disabled")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def debug_mysql(self):
|
||||||
|
"""Start/Stop MySQL debug"""
|
||||||
|
# MySQL start global debug
|
||||||
|
if (self.app.pargs.mysql == 'on' and not self.app.pargs.site_name):
|
||||||
|
if not WOShellExec.cmd_exec(self, "mysql -e \"show variables like"
|
||||||
|
" \'slow_query_log\';\" | "
|
||||||
|
"grep ON"):
|
||||||
|
Log.info(self, "Setting up MySQL slow log")
|
||||||
|
WOMysql.execute(self, "set global slow_query_log = "
|
||||||
|
"\'ON\';")
|
||||||
|
WOMysql.execute(self, "set global slow_query_log_file = "
|
||||||
|
"\'/var/log/mysql/mysql-slow.log\';")
|
||||||
|
WOMysql.execute(self, "set global long_query_time = 2;")
|
||||||
|
WOMysql.execute(self, "set global log_queries_not_using"
|
||||||
|
"_indexes = \'ON\';")
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL slow log is already enabled")
|
||||||
|
|
||||||
|
self.msg = self.msg + ['/var/log/mysql/mysql-slow.log']
|
||||||
|
|
||||||
|
# MySQL stop global debug
|
||||||
|
elif (self.app.pargs.mysql == 'off' and not self.app.pargs.site_name):
|
||||||
|
if WOShellExec.cmd_exec(self, "mysql -e \"show variables like \'"
|
||||||
|
"slow_query_log\';\" | grep ON"):
|
||||||
|
Log.info(self, "Disabling MySQL slow log")
|
||||||
|
WOMysql.execute(self, "set global slow_query_log = \'OFF\';")
|
||||||
|
WOMysql.execute(self, "set global slow_query_log_file = \'"
|
||||||
|
"/var/log/mysql/mysql-slow.log\';")
|
||||||
|
WOMysql.execute(self, "set global long_query_time = 10;")
|
||||||
|
WOMysql.execute(self, "set global log_queries_not_using_index"
|
||||||
|
"es = \'OFF\';")
|
||||||
|
WOShellExec.cmd_exec(self, "crontab -l | sed \'/#WordOps "
|
||||||
|
"start/,/#WordOps end/d\' | crontab -")
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL slow log already disabled")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def debug_wp(self):
|
||||||
|
"""Start/Stop WordPress debug"""
|
||||||
|
if (self.app.pargs.wp == 'on' and self.app.pargs.site_name):
|
||||||
|
wp_config = ("{0}/{1}/wp-config.php"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name))
|
||||||
|
webroot = "{0}{1}".format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)
|
||||||
|
# Check wp-config.php file into htdocs folder
|
||||||
|
if not os.path.isfile(wp_config):
|
||||||
|
wp_config = ("{0}/{1}/htdocs/wp-config.php"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name))
|
||||||
|
if os.path.isfile(wp_config):
|
||||||
|
if not WOShellExec.cmd_exec(self, "grep \"\'WP_DEBUG\'\" {0} |"
|
||||||
|
" grep true".format(wp_config)):
|
||||||
|
Log.info(self, "Starting WordPress debug")
|
||||||
|
open("{0}/htdocs/wp-content/debug.log".format(webroot),
|
||||||
|
encoding='utf-8', mode='a').close()
|
||||||
|
WOShellExec.cmd_exec(self, "chown {1}: {0}/htdocs/wp-"
|
||||||
|
"content/debug.log"
|
||||||
|
"".format(webroot,
|
||||||
|
WOVariables.wo_php_user))
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"s/define(\'WP_DEBUG\'"
|
||||||
|
".*/define(\'WP_DEBUG\', true);\\n"
|
||||||
|
"define(\'WP_DEBUG_DISPLAY\', false);"
|
||||||
|
"\\ndefine(\'WP_DEBUG_LOG\', true);"
|
||||||
|
"\\ndefine(\'SAVEQUERIES\', true);/\""
|
||||||
|
" {0}".format(wp_config))
|
||||||
|
WOShellExec.cmd_exec(self, "cd {0}/htdocs/ && wp"
|
||||||
|
" plugin --allow-root install "
|
||||||
|
"developer query-monitor"
|
||||||
|
.format(webroot))
|
||||||
|
WOShellExec.cmd_exec(self, "chown -R {1}: {0}/htdocs/"
|
||||||
|
"wp-content/plugins"
|
||||||
|
.format(webroot,
|
||||||
|
WOVariables.wo_php_user))
|
||||||
|
|
||||||
|
self.msg = self.msg + ['{0}{1}/htdocs/wp-content'
|
||||||
|
'/debug.log'
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
|
||||||
|
else:
|
||||||
|
Log.info(self, "Unable to find wp-config.php for site: {0}"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
|
||||||
|
elif (self.app.pargs.wp == 'off' and self.app.pargs.site_name):
|
||||||
|
wp_config = ("{0}{1}/wp-config.php"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name))
|
||||||
|
webroot = "{0}{1}".format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)
|
||||||
|
# Check wp-config.php file into htdocs folder
|
||||||
|
if not os.path.isfile(wp_config):
|
||||||
|
wp_config = ("{0}/{1}/htdocs/wp-config.php"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name))
|
||||||
|
if os.path.isfile(wp_config):
|
||||||
|
if WOShellExec.cmd_exec(self, "grep \"\'WP_DEBUG\'\" {0} | "
|
||||||
|
"grep true".format(wp_config)):
|
||||||
|
Log.info(self, "Disabling WordPress debug")
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"s/define(\'WP_DEBUG\'"
|
||||||
|
", true);/define(\'WP_DEBUG\', "
|
||||||
|
"false);/\" {0}".format(wp_config))
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"/define(\'"
|
||||||
|
"WP_DEBUG_DISPLAY\', false);/d\" {0}"
|
||||||
|
.format(wp_config))
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"/define(\'"
|
||||||
|
"WP_DEBUG_LOG\', true);/d\" {0}"
|
||||||
|
.format(wp_config))
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"/define(\'"
|
||||||
|
"SAVEQUERIES\', "
|
||||||
|
"true);/d\" {0}".format(wp_config))
|
||||||
|
else:
|
||||||
|
Log.info(self, "WordPress debug all already disabled")
|
||||||
|
else:
|
||||||
|
Log.error(self, "Missing argument site name")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def debug_rewrite(self):
|
||||||
|
"""Start/Stop Nginx rewrite rules debug"""
|
||||||
|
# Start Nginx rewrite debug globally
|
||||||
|
if (self.app.pargs.rewrite == 'on' and not self.app.pargs.site_name):
|
||||||
|
if not WOShellExec.cmd_exec(self, "grep \"rewrite_log on;\" "
|
||||||
|
"/etc/nginx/nginx.conf"):
|
||||||
|
Log.info(self, "Setting up Nginx rewrite logs")
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \'/http {/a \\\\t"
|
||||||
|
"rewrite_log on;\' /etc/nginx/nginx.conf")
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx rewrite logs already enabled")
|
||||||
|
|
||||||
|
if '/var/log/nginx/*.error.log' not in self.msg:
|
||||||
|
self.msg = self.msg + ['/var/log/nginx/*.error.log']
|
||||||
|
|
||||||
|
# Stop Nginx rewrite debug globally
|
||||||
|
elif (self.app.pargs.rewrite == 'off'
|
||||||
|
and not self.app.pargs.site_name):
|
||||||
|
if WOShellExec.cmd_exec(self, "grep \"rewrite_log on;\" "
|
||||||
|
"/etc/nginx/nginx.conf"):
|
||||||
|
Log.info(self, "Disabling Nginx rewrite logs")
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"/rewrite_log.*/d\""
|
||||||
|
" /etc/nginx/nginx.conf")
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx rewrite logs already disabled")
|
||||||
|
# Start Nginx rewrite for site
|
||||||
|
elif (self.app.pargs.rewrite == 'on' and self.app.pargs.site_name):
|
||||||
|
config_path = ("/etc/nginx/sites-available/{0}"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
if not WOShellExec.cmd_exec(self, "grep \"rewrite_log on;\" {0}"
|
||||||
|
.format(config_path)):
|
||||||
|
Log.info(self, "Setting up Nginx rewrite logs for {0}"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"/access_log/i \\\\\\t"
|
||||||
|
"rewrite_log on;\" {0}"
|
||||||
|
.format(config_path))
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx rewrite logs for {0} already setup"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
|
||||||
|
if ('{0}{1}/logs/error.log'.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)
|
||||||
|
not in self.msg):
|
||||||
|
self.msg = self.msg + ['{0}{1}/logs/error.log'
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
|
||||||
|
# Stop Nginx rewrite for site
|
||||||
|
elif (self.app.pargs.rewrite == 'off' and self.app.pargs.site_name):
|
||||||
|
config_path = ("/etc/nginx/sites-available/{0}"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
if WOShellExec.cmd_exec(self, "grep \"rewrite_log on;\" {0}"
|
||||||
|
.format(config_path)):
|
||||||
|
Log.info(self, "Disabling Nginx rewrite logs for {0}"
|
||||||
|
.format(self.app.pargs.site_name))
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"/rewrite_log.*/d\" {0}"
|
||||||
|
.format(config_path))
|
||||||
|
self.trigger_nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx rewrite logs for {0} already "
|
||||||
|
" disabled".format(self.app.pargs.site_name))
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def signal_handler(self, signal, frame):
|
||||||
|
"""Handle Ctrl+c hevent for -i option of debug"""
|
||||||
|
self.start = False
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
self.app.pargs.nginx = 'off'
|
||||||
|
self.debug_nginx()
|
||||||
|
if self.app.pargs.php:
|
||||||
|
self.app.pargs.php = 'off'
|
||||||
|
self.debug_php()
|
||||||
|
if self.app.pargs.php7:
|
||||||
|
self.app.pargs.php7 = 'off'
|
||||||
|
self.debug_php7()
|
||||||
|
if self.app.pargs.fpm:
|
||||||
|
self.app.pargs.fpm = 'off'
|
||||||
|
self.debug_fpm()
|
||||||
|
if self.app.pargs.fpm7:
|
||||||
|
self.app.pargs.fpm7 = 'off'
|
||||||
|
self.debug_fpm7()
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
# MySQL debug will not work for remote MySQL
|
||||||
|
if WOVariables.wo_mysql_host is "localhost":
|
||||||
|
self.app.pargs.mysql = 'off'
|
||||||
|
self.debug_mysql()
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, WordOps does not support "
|
||||||
|
"debugging remote servers")
|
||||||
|
if self.app.pargs.wp:
|
||||||
|
self.app.pargs.wp = 'off'
|
||||||
|
self.debug_wp()
|
||||||
|
if self.app.pargs.rewrite:
|
||||||
|
self.app.pargs.rewrite = 'off'
|
||||||
|
self.debug_rewrite()
|
||||||
|
|
||||||
|
# Reload Nginx
|
||||||
|
if self.trigger_nginx:
|
||||||
|
WOService.reload_service(self, 'nginx')
|
||||||
|
|
||||||
|
# Reload PHP
|
||||||
|
if self.trigger_php:
|
||||||
|
if WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic':
|
||||||
|
if WOAptGet.is_installed(self,'php5.6-fpm'):
|
||||||
|
WOService.reload_service(self, 'php5.6-fpm')
|
||||||
|
if WOAptGet.is_installed(self,'php7.0-fpm'):
|
||||||
|
WOService.reload_service(self, 'php7.0-fpm')
|
||||||
|
else:
|
||||||
|
WOService.reload_service(self, 'php5-fpm')
|
||||||
|
self.app.close(0)
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
"""Default function of debug"""
|
||||||
|
# self.start = True
|
||||||
|
self.interactive = False
|
||||||
|
self.msg = []
|
||||||
|
self.trigger_nginx = False
|
||||||
|
self.trigger_php = False
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.php) and (not self.app.pargs.php7)
|
||||||
|
and (not self.app.pargs.fpm) and (not self.app.pargs.fpm7) and (not self.app.pargs.mysql)
|
||||||
|
and (not self.app.pargs.wp) and (not self.app.pargs.rewrite)
|
||||||
|
and (not self.app.pargs.all)
|
||||||
|
and (not self.app.pargs.site_name)
|
||||||
|
and (not self.app.pargs.import_slow_log)
|
||||||
|
and (not self.app.pargs.interval)):
|
||||||
|
if self.app.pargs.stop or self.app.pargs.start:
|
||||||
|
print("--start/stop option is deprecated since ee v3.0.5")
|
||||||
|
self.app.args.print_help()
|
||||||
|
else:
|
||||||
|
self.app.args.print_help()
|
||||||
|
|
||||||
|
if self.app.pargs.import_slow_log:
|
||||||
|
self.import_slow_log()
|
||||||
|
|
||||||
|
if self.app.pargs.interval:
|
||||||
|
try:
|
||||||
|
cron_time = int(self.app.pargs.interval)
|
||||||
|
except Exception as e:
|
||||||
|
cron_time = 5
|
||||||
|
|
||||||
|
try:
|
||||||
|
if not WOShellExec.cmd_exec(self, "crontab -l | grep "
|
||||||
|
"'wo debug --import-slow-log'"):
|
||||||
|
if not cron_time == 0:
|
||||||
|
Log.info(self, "setting up crontab entry,"
|
||||||
|
" please wait...")
|
||||||
|
WOShellExec.cmd_exec(self, "/bin/bash -c \"crontab -l "
|
||||||
|
"2> /dev/null | {{ cat; echo -e"
|
||||||
|
" \\\"#WordOps start MySQL "
|
||||||
|
"slow log \\n*/{0} * * * * "
|
||||||
|
"/usr/local/bin/wo debug"
|
||||||
|
" --import-slow-log\\n"
|
||||||
|
"#WordOps end MySQL slow log"
|
||||||
|
"\\\"; }} | crontab -\""
|
||||||
|
.format(cron_time))
|
||||||
|
else:
|
||||||
|
if not cron_time == 0:
|
||||||
|
Log.info(self, "updating crontab entry,"
|
||||||
|
" please wait...")
|
||||||
|
if not WOShellExec.cmd_exec(self, "/bin/bash -c "
|
||||||
|
"\"crontab "
|
||||||
|
"-l | sed '/WordOps "
|
||||||
|
"start MySQL slow "
|
||||||
|
"log/!b;n;c\*\/{0} "
|
||||||
|
"\* \* \* "
|
||||||
|
"\* \/usr"
|
||||||
|
"\/local\/bin\/wo debug "
|
||||||
|
"--import\-slow\-log' "
|
||||||
|
"| crontab -\""
|
||||||
|
.format(cron_time)):
|
||||||
|
Log.error(self, "failed to update crontab entry")
|
||||||
|
else:
|
||||||
|
Log.info(self, "removing crontab entry,"
|
||||||
|
" please wait...")
|
||||||
|
if not WOShellExec.cmd_exec(self, "/bin/bash -c "
|
||||||
|
"\"crontab "
|
||||||
|
"-l | sed '/WordOps "
|
||||||
|
"start MySQL slow "
|
||||||
|
"log/,+2d'"
|
||||||
|
"| crontab -\""
|
||||||
|
.format(cron_time)):
|
||||||
|
Log.error(self, "failed to remove crontab entry")
|
||||||
|
except CommandExecutionError as e:
|
||||||
|
Log.debug(self, str(e))
|
||||||
|
|
||||||
|
if self.app.pargs.all == 'on':
|
||||||
|
if self.app.pargs.site_name:
|
||||||
|
self.app.pargs.wp = 'on'
|
||||||
|
self.app.pargs.nginx = 'on'
|
||||||
|
self.app.pargs.php = 'on'
|
||||||
|
self.app.pargs.fpm = 'on'
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') and WOAptGet.is_installed(self,'php7.0-fpm'):
|
||||||
|
self.app.pargs.php7 = 'on'
|
||||||
|
self.app.pargs.fpm7 = 'on'
|
||||||
|
self.app.pargs.mysql = 'on'
|
||||||
|
self.app.pargs.rewrite = 'on'
|
||||||
|
|
||||||
|
if self.app.pargs.all == 'off':
|
||||||
|
if self.app.pargs.site_name:
|
||||||
|
self.app.pargs.wp = 'off'
|
||||||
|
self.app.pargs.nginx = 'off'
|
||||||
|
self.app.pargs.php = 'off'
|
||||||
|
self.app.pargs.fpm = 'off'
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') and WOAptGet.is_installed(self,'php7.0-fpm'):
|
||||||
|
self.app.pargs.php7 = 'off'
|
||||||
|
self.app.pargs.fpm7 = 'off'
|
||||||
|
self.app.pargs.mysql = 'off'
|
||||||
|
self.app.pargs.rewrite = 'off'
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.php) and (not self.app.pargs.php7)
|
||||||
|
and (not self.app.pargs.fpm) and (not self.app.pargs.fpm7) and (not self.app.pargs.mysql)
|
||||||
|
and (not self.app.pargs.wp) and (not self.app.pargs.rewrite)
|
||||||
|
and self.app.pargs.site_name):
|
||||||
|
self.app.args.print_help()
|
||||||
|
# self.app.pargs.nginx = 'on'
|
||||||
|
# self.app.pargs.wp = 'on'
|
||||||
|
# self.app.pargs.rewrite = 'on'
|
||||||
|
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
self.debug_nginx()
|
||||||
|
if self.app.pargs.php:
|
||||||
|
self.debug_php()
|
||||||
|
if self.app.pargs.fpm:
|
||||||
|
self.debug_fpm()
|
||||||
|
if self.app.pargs.php7:
|
||||||
|
self.debug_php7()
|
||||||
|
if self.app.pargs.fpm7:
|
||||||
|
self.debug_fpm7()
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
# MySQL debug will not work for remote MySQL
|
||||||
|
if WOVariables.wo_mysql_host is "localhost":
|
||||||
|
self.debug_mysql()
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, WordOps does not support "
|
||||||
|
"debugging remote servers")
|
||||||
|
if self.app.pargs.wp:
|
||||||
|
self.debug_wp()
|
||||||
|
if self.app.pargs.rewrite:
|
||||||
|
self.debug_rewrite()
|
||||||
|
|
||||||
|
if self.app.pargs.interactive:
|
||||||
|
self.interactive = True
|
||||||
|
|
||||||
|
# Reload Nginx
|
||||||
|
if self.trigger_nginx:
|
||||||
|
WOService.reload_service(self, 'nginx')
|
||||||
|
# Reload PHP
|
||||||
|
if self.trigger_php:
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic'):
|
||||||
|
if WOAptGet.is_installed(self,'php5.6-fpm'):
|
||||||
|
WOService.restart_service(self, 'php5.6-fpm')
|
||||||
|
if WOAptGet.is_installed(self,'php7.0-fpm'):
|
||||||
|
WOService.restart_service(self, 'php7.0-fpm')
|
||||||
|
else:
|
||||||
|
WOService.restart_service(self, 'php5-fpm')
|
||||||
|
if WOVariables.wo_platform_codename == 'jessie':
|
||||||
|
WOService.restart_service(self, 'php7.0-fpm')
|
||||||
|
|
||||||
|
if len(self.msg) > 0:
|
||||||
|
if not self.app.pargs.interactive:
|
||||||
|
disp_msg = ' '.join(self.msg)
|
||||||
|
Log.info(self, "Use following command to check debug logs:\n"
|
||||||
|
+ Log.ENDC + "tail -f {0}".format(disp_msg))
|
||||||
|
else:
|
||||||
|
signal.signal(signal.SIGINT, self.signal_handler)
|
||||||
|
watch_list = []
|
||||||
|
for w_list in self.msg:
|
||||||
|
watch_list = watch_list + glob.glob(w_list)
|
||||||
|
|
||||||
|
logwatch(self, watch_list)
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def import_slow_log(self):
|
||||||
|
"""Default function for import slow log"""
|
||||||
|
if os.path.isdir("{0}22222/htdocs/db/anemometer"
|
||||||
|
.format(WOVariables.wo_webroot)):
|
||||||
|
if os.path.isfile("/var/log/mysql/mysql-slow.log"):
|
||||||
|
# Get Anemometer user name and password
|
||||||
|
Log.info(self, "Importing MySQL slow log to Anemometer")
|
||||||
|
host = os.popen("grep -e \"\'host\'\" {0}22222/htdocs/"
|
||||||
|
.format(WOVariables.wo_webroot)
|
||||||
|
+ "db/anemometer/conf/config.inc.php "
|
||||||
|
"| head -1 | cut -d\\\' -f4 | "
|
||||||
|
"tr -d '\n'").read()
|
||||||
|
user = os.popen("grep -e \"\'user\'\" {0}22222/htdocs/"
|
||||||
|
.format(WOVariables.wo_webroot)
|
||||||
|
+ "db/anemometer/conf/config.inc.php "
|
||||||
|
"| head -1 | cut -d\\\' -f4 | "
|
||||||
|
"tr -d '\n'").read()
|
||||||
|
password = os.popen("grep -e \"\'password\'\" {0}22222/"
|
||||||
|
.format(WOVariables.wo_webroot)
|
||||||
|
+ "htdocs/db/anemometer/conf"
|
||||||
|
"/config.inc.php "
|
||||||
|
"| head -1 | cut -d\\\' -f4 | "
|
||||||
|
"tr -d '\n'").read()
|
||||||
|
|
||||||
|
# Import slow log Anemometer using pt-query-digest
|
||||||
|
try:
|
||||||
|
WOShellExec.cmd_exec(self, "pt-query-digest --user={0} "
|
||||||
|
"--password={1} "
|
||||||
|
"--review D=slow_query_log,"
|
||||||
|
"t=global_query_review "
|
||||||
|
"--history D=slow_query_log,t="
|
||||||
|
"global_query_review_history "
|
||||||
|
"--no-report --limit=0% "
|
||||||
|
"--filter=\" \\$event->{{Bytes}} = "
|
||||||
|
"length(\\$event->{{arg}}) "
|
||||||
|
"and \\$event->{{hostname}}=\\\""
|
||||||
|
"{2}\\\"\" "
|
||||||
|
"/var/log/mysql/mysql-slow.log"
|
||||||
|
.format(user, password, host))
|
||||||
|
except CommandExecutionError as e:
|
||||||
|
Log.debug(self, str(e))
|
||||||
|
Log.error(self, "MySQL slow log import failed.")
|
||||||
|
else:
|
||||||
|
Log.error(self, "MySQL slow log file not found,"
|
||||||
|
" so not imported slow logs")
|
||||||
|
else:
|
||||||
|
Log.error(self, "Anemometer is not installed." +
|
||||||
|
Log.ENDC + "\n Install Anemometer with:"
|
||||||
|
+ Log.BOLD + "\n `wo stack install --utils`"
|
||||||
|
+ Log.ENDC)
|
||||||
|
|
||||||
|
|
||||||
|
def load(app):
|
||||||
|
# register the plugin class.. this only happens if the plugin is enabled
|
||||||
|
handler.register(WODebugController)
|
||||||
|
# register a hook (function) to run after arguments are parsed.
|
||||||
|
hook.register('post_argument_parsing', wo_debug_hook)
|
||||||
34
wo/cli/plugins/import_slow_log.py
Normal file
34
wo/cli/plugins/import_slow_log.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from cement.core import handler, hook
|
||||||
|
from wo.core.shellexec import WOShellExec
|
||||||
|
from wo.core.logging import Log
|
||||||
|
from wo.core.variables import WOVariables
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def wo_import_slow_log_hook(app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WOImportslowlogController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'import_slow_log'
|
||||||
|
stacked_on = 'base'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
description = 'Import MySQL slow log to Anemometer database'
|
||||||
|
usage = "wo import-slow-log"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
Log.info(self, "This command is deprecated."
|
||||||
|
" You can use this command instead, " +
|
||||||
|
Log.ENDC + Log.BOLD + "\n`wo debug --import-slow-log`" +
|
||||||
|
Log.ENDC)
|
||||||
|
|
||||||
|
|
||||||
|
def load(app):
|
||||||
|
# register the plugin class.. this only happens if the plugin is enabled
|
||||||
|
handler.register(WOImportslowlogController)
|
||||||
|
|
||||||
|
# register a hook (function) to run after arguments are parsed.
|
||||||
|
hook.register('post_argument_parsing', wo_import_slow_log_hook)
|
||||||
289
wo/cli/plugins/info.py
Normal file
289
wo/cli/plugins/info.py
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
"""WOInfo Plugin for WordOps"""
|
||||||
|
|
||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from cement.core import handler, hook
|
||||||
|
from wo.core.variables import WOVariables
|
||||||
|
from pynginxconfig import NginxConfig
|
||||||
|
from wo.core.aptget import WOAptGet
|
||||||
|
from wo.core.shellexec import WOShellExec
|
||||||
|
from wo.core.logging import Log
|
||||||
|
import os
|
||||||
|
import configparser
|
||||||
|
|
||||||
|
|
||||||
|
def wo_info_hook(app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WOInfoController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'info'
|
||||||
|
stacked_on = 'base'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
description = ('Display configuration information related to Nginx,'
|
||||||
|
' PHP and MySQL')
|
||||||
|
arguments = [
|
||||||
|
(['--mysql'],
|
||||||
|
dict(help='Get MySQL configuration information',
|
||||||
|
action='store_true')),
|
||||||
|
(['--php'],
|
||||||
|
dict(help='Get PHP configuration information',
|
||||||
|
action='store_true')),
|
||||||
|
(['--php7'],
|
||||||
|
dict(help='Get PHP 7.0 configuration information',
|
||||||
|
action='store_true')),
|
||||||
|
(['--nginx'],
|
||||||
|
dict(help='Get Nginx configuration information',
|
||||||
|
action='store_true')),
|
||||||
|
]
|
||||||
|
usage = "wo info [options]"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def info_nginx(self):
|
||||||
|
"""Display Nginx information"""
|
||||||
|
version = os.popen("nginx -v 2>&1 | cut -d':' -f2 | cut -d' ' -f2 | "
|
||||||
|
"cut -d'/' -f2 | tr -d '\n'").read()
|
||||||
|
allow = os.popen("grep ^allow /etc/nginx/common/acl.conf | "
|
||||||
|
"cut -d' ' -f2 | cut -d';' -f1 | tr '\n' ' '").read()
|
||||||
|
nc = NginxConfig()
|
||||||
|
nc.loadf('/etc/nginx/nginx.conf')
|
||||||
|
user = nc.get('user')[1]
|
||||||
|
worker_processes = nc.get('worker_processes')[1]
|
||||||
|
worker_connections = nc.get([('events',), 'worker_connections'])[1]
|
||||||
|
keepalive_timeout = nc.get([('http',), 'keepalive_timeout'])[1]
|
||||||
|
fastcgi_read_timeout = nc.get([('http',),
|
||||||
|
'fastcgi_read_timeout'])[1]
|
||||||
|
client_max_body_size = nc.get([('http',),
|
||||||
|
'client_max_body_size'])[1]
|
||||||
|
data = dict(version=version, allow=allow, user=user,
|
||||||
|
worker_processes=worker_processes,
|
||||||
|
keepalive_timeout=keepalive_timeout,
|
||||||
|
worker_connections=worker_connections,
|
||||||
|
fastcgi_read_timeout=fastcgi_read_timeout,
|
||||||
|
client_max_body_size=client_max_body_size)
|
||||||
|
self.app.render((data), 'info_nginx.mustache')
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def info_php(self):
|
||||||
|
"""Display PHP information"""
|
||||||
|
version = os.popen("{0} -v 2>/dev/null | head -n1 | cut -d' ' -f2 |".format("php5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php") +
|
||||||
|
" cut -d'+' -f1 | tr -d '\n'").read
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('/etc/{0}/fpm/php.ini'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
expose_php = config['PHP']['expose_php']
|
||||||
|
memory_limit = config['PHP']['memory_limit']
|
||||||
|
post_max_size = config['PHP']['post_max_size']
|
||||||
|
upload_max_filesize = config['PHP']['upload_max_filesize']
|
||||||
|
max_execution_time = config['PHP']['max_execution_time']
|
||||||
|
|
||||||
|
config.read('/etc/{0}/fpm/pool.d/www.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
www_listen = config['www']['listen']
|
||||||
|
www_ping_path = config['www']['ping.path']
|
||||||
|
www_pm_status_path = config['www']['pm.status_path']
|
||||||
|
www_pm = config['www']['pm']
|
||||||
|
www_pm_max_requests = config['www']['pm.max_requests']
|
||||||
|
www_pm_max_children = config['www']['pm.max_children']
|
||||||
|
www_pm_start_servers = config['www']['pm.start_servers']
|
||||||
|
www_pm_min_spare_servers = config['www']['pm.min_spare_servers']
|
||||||
|
www_pm_max_spare_servers = config['www']['pm.max_spare_servers']
|
||||||
|
www_request_terminate_time = (config['www']
|
||||||
|
['request_terminate_timeout'])
|
||||||
|
try:
|
||||||
|
www_xdebug = (config['www']['php_admin_flag[xdebug.profiler_enable'
|
||||||
|
'_trigger]'])
|
||||||
|
except Exception as e:
|
||||||
|
www_xdebug = 'off'
|
||||||
|
|
||||||
|
config.read('/etc/{0}/fpm/pool.d/debug.conf'.format("php/5.6" if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic') else "php5"))
|
||||||
|
debug_listen = config['debug']['listen']
|
||||||
|
debug_ping_path = config['debug']['ping.path']
|
||||||
|
debug_pm_status_path = config['debug']['pm.status_path']
|
||||||
|
debug_pm = config['debug']['pm']
|
||||||
|
debug_pm_max_requests = config['debug']['pm.max_requests']
|
||||||
|
debug_pm_max_children = config['debug']['pm.max_children']
|
||||||
|
debug_pm_start_servers = config['debug']['pm.start_servers']
|
||||||
|
debug_pm_min_spare_servers = config['debug']['pm.min_spare_servers']
|
||||||
|
debug_pm_max_spare_servers = config['debug']['pm.max_spare_servers']
|
||||||
|
debug_request_terminate = (config['debug']
|
||||||
|
['request_terminate_timeout'])
|
||||||
|
try:
|
||||||
|
debug_xdebug = (config['debug']['php_admin_flag[xdebug.profiler_'
|
||||||
|
'enable_trigger]'])
|
||||||
|
except Exception as e:
|
||||||
|
debug_xdebug = 'off'
|
||||||
|
|
||||||
|
data = dict(version=version, expose_php=expose_php,
|
||||||
|
memory_limit=memory_limit, post_max_size=post_max_size,
|
||||||
|
upload_max_filesize=upload_max_filesize,
|
||||||
|
max_execution_time=max_execution_time,
|
||||||
|
www_listen=www_listen, www_ping_path=www_ping_path,
|
||||||
|
www_pm_status_path=www_pm_status_path, www_pm=www_pm,
|
||||||
|
www_pm_max_requests=www_pm_max_requests,
|
||||||
|
www_pm_max_children=www_pm_max_children,
|
||||||
|
www_pm_start_servers=www_pm_start_servers,
|
||||||
|
www_pm_min_spare_servers=www_pm_min_spare_servers,
|
||||||
|
www_pm_max_spare_servers=www_pm_max_spare_servers,
|
||||||
|
www_request_terminate_timeout=www_request_terminate_time,
|
||||||
|
www_xdebug_profiler_enable_trigger=www_xdebug,
|
||||||
|
debug_listen=debug_listen, debug_ping_path=debug_ping_path,
|
||||||
|
debug_pm_status_path=debug_pm_status_path,
|
||||||
|
debug_pm=debug_pm,
|
||||||
|
debug_pm_max_requests=debug_pm_max_requests,
|
||||||
|
debug_pm_max_children=debug_pm_max_children,
|
||||||
|
debug_pm_start_servers=debug_pm_start_servers,
|
||||||
|
debug_pm_min_spare_servers=debug_pm_min_spare_servers,
|
||||||
|
debug_pm_max_spare_servers=debug_pm_max_spare_servers,
|
||||||
|
debug_request_terminate_timeout=debug_request_terminate,
|
||||||
|
debug_xdebug_profiler_enable_trigger=debug_xdebug)
|
||||||
|
self.app.render((data), 'info_php.mustache')
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def info_php7(self):
|
||||||
|
"""Display PHP information"""
|
||||||
|
version = os.popen("php7.0 -v 2>/dev/null | head -n1 | cut -d' ' -f2 |"
|
||||||
|
" cut -d'+' -f1 | tr -d '\n'").read
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('/etc/php/7.0/fpm/php.ini')
|
||||||
|
expose_php = config['PHP']['expose_php']
|
||||||
|
memory_limit = config['PHP']['memory_limit']
|
||||||
|
post_max_size = config['PHP']['post_max_size']
|
||||||
|
upload_max_filesize = config['PHP']['upload_max_filesize']
|
||||||
|
max_execution_time = config['PHP']['max_execution_time']
|
||||||
|
|
||||||
|
config.read('/etc/php/7.0/fpm/pool.d/www.conf')
|
||||||
|
www_listen = config['www']['listen']
|
||||||
|
www_ping_path = config['www']['ping.path']
|
||||||
|
www_pm_status_path = config['www']['pm.status_path']
|
||||||
|
www_pm = config['www']['pm']
|
||||||
|
www_pm_max_requests = config['www']['pm.max_requests']
|
||||||
|
www_pm_max_children = config['www']['pm.max_children']
|
||||||
|
www_pm_start_servers = config['www']['pm.start_servers']
|
||||||
|
www_pm_min_spare_servers = config['www']['pm.min_spare_servers']
|
||||||
|
www_pm_max_spare_servers = config['www']['pm.max_spare_servers']
|
||||||
|
www_request_terminate_time = (config['www']
|
||||||
|
['request_terminate_timeout'])
|
||||||
|
try:
|
||||||
|
www_xdebug = (config['www']['php_admin_flag[xdebug.profiler_enable'
|
||||||
|
'_trigger]'])
|
||||||
|
except Exception as e:
|
||||||
|
www_xdebug = 'off'
|
||||||
|
|
||||||
|
config.read('/etc/php/7.0/fpm/pool.d/debug.conf')
|
||||||
|
debug_listen = config['debug']['listen']
|
||||||
|
debug_ping_path = config['debug']['ping.path']
|
||||||
|
debug_pm_status_path = config['debug']['pm.status_path']
|
||||||
|
debug_pm = config['debug']['pm']
|
||||||
|
debug_pm_max_requests = config['debug']['pm.max_requests']
|
||||||
|
debug_pm_max_children = config['debug']['pm.max_children']
|
||||||
|
debug_pm_start_servers = config['debug']['pm.start_servers']
|
||||||
|
debug_pm_min_spare_servers = config['debug']['pm.min_spare_servers']
|
||||||
|
debug_pm_max_spare_servers = config['debug']['pm.max_spare_servers']
|
||||||
|
debug_request_terminate = (config['debug']
|
||||||
|
['request_terminate_timeout'])
|
||||||
|
try:
|
||||||
|
debug_xdebug = (config['debug']['php_admin_flag[xdebug.profiler_'
|
||||||
|
'enable_trigger]'])
|
||||||
|
except Exception as e:
|
||||||
|
debug_xdebug = 'off'
|
||||||
|
|
||||||
|
data = dict(version=version, expose_php=expose_php,
|
||||||
|
memory_limit=memory_limit, post_max_size=post_max_size,
|
||||||
|
upload_max_filesize=upload_max_filesize,
|
||||||
|
max_execution_time=max_execution_time,
|
||||||
|
www_listen=www_listen, www_ping_path=www_ping_path,
|
||||||
|
www_pm_status_path=www_pm_status_path, www_pm=www_pm,
|
||||||
|
www_pm_max_requests=www_pm_max_requests,
|
||||||
|
www_pm_max_children=www_pm_max_children,
|
||||||
|
www_pm_start_servers=www_pm_start_servers,
|
||||||
|
www_pm_min_spare_servers=www_pm_min_spare_servers,
|
||||||
|
www_pm_max_spare_servers=www_pm_max_spare_servers,
|
||||||
|
www_request_terminate_timeout=www_request_terminate_time,
|
||||||
|
www_xdebug_profiler_enable_trigger=www_xdebug,
|
||||||
|
debug_listen=debug_listen, debug_ping_path=debug_ping_path,
|
||||||
|
debug_pm_status_path=debug_pm_status_path,
|
||||||
|
debug_pm=debug_pm,
|
||||||
|
debug_pm_max_requests=debug_pm_max_requests,
|
||||||
|
debug_pm_max_children=debug_pm_max_children,
|
||||||
|
debug_pm_start_servers=debug_pm_start_servers,
|
||||||
|
debug_pm_min_spare_servers=debug_pm_min_spare_servers,
|
||||||
|
debug_pm_max_spare_servers=debug_pm_max_spare_servers,
|
||||||
|
debug_request_terminate_timeout=debug_request_terminate,
|
||||||
|
debug_xdebug_profiler_enable_trigger=debug_xdebug)
|
||||||
|
self.app.render((data), 'info_php.mustache')
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def info_mysql(self):
|
||||||
|
"""Display MySQL information"""
|
||||||
|
version = os.popen("mysql -V | awk '{print($5)}' | cut -d ',' "
|
||||||
|
"-f1 | tr -d '\n'").read()
|
||||||
|
host = "localhost"
|
||||||
|
port = os.popen("mysql -e \"show variables\" | grep ^port | awk "
|
||||||
|
"'{print($2)}' | tr -d '\n'").read()
|
||||||
|
wait_timeout = os.popen("mysql -e \"show variables\" | grep "
|
||||||
|
"^wait_timeout | awk '{print($2)}' | "
|
||||||
|
"tr -d '\n'").read()
|
||||||
|
interactive_timeout = os.popen("mysql -e \"show variables\" | grep "
|
||||||
|
"^interactive_timeout | awk "
|
||||||
|
"'{print($2)}' | tr -d '\n'").read()
|
||||||
|
max_used_connections = os.popen("mysql -e \"show global status\" | "
|
||||||
|
"grep Max_used_connections | awk "
|
||||||
|
"'{print($2)}' | tr -d '\n'").read()
|
||||||
|
datadir = os.popen("mysql -e \"show variables\" | grep datadir | awk"
|
||||||
|
" '{print($2)}' | tr -d '\n'").read()
|
||||||
|
socket = os.popen("mysql -e \"show variables\" | grep \"^socket\" | "
|
||||||
|
"awk '{print($2)}' | tr -d '\n'").read()
|
||||||
|
data = dict(version=version, host=host, port=port,
|
||||||
|
wait_timeout=wait_timeout,
|
||||||
|
interactive_timeout=interactive_timeout,
|
||||||
|
max_used_connections=max_used_connections,
|
||||||
|
datadir=datadir, socket=socket)
|
||||||
|
self.app.render((data), 'info_mysql.mustache')
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
"""default function for info"""
|
||||||
|
if (not self.app.pargs.nginx and not self.app.pargs.php
|
||||||
|
and not self.app.pargs.mysql and not self.app.pargs.php7):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.php = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
self.app.pargs.php = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
if WOAptGet.is_installed(self, 'nginx-custom') or WOAptGet.is_installed(self, 'nginx-common'):
|
||||||
|
self.info_nginx()
|
||||||
|
else:
|
||||||
|
Log.error(self, "Nginx is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
if (WOVariables.wo_platform_distro == 'debian' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
if WOAptGet.is_installed(self, 'php5-fpm'):
|
||||||
|
self.info_php()
|
||||||
|
else:
|
||||||
|
Log.error(self, "PHP5 is not installed")
|
||||||
|
else:
|
||||||
|
if WOAptGet.is_installed(self, 'php5.6-fpm'):
|
||||||
|
self.info_php()
|
||||||
|
else:
|
||||||
|
Log.error(self, "PHP5.6 is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php7:
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
self.info_php7()
|
||||||
|
else:
|
||||||
|
Log.error(self, "PHP 7.0 is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
if WOShellExec.cmd_exec(self, "mysqladmin ping"):
|
||||||
|
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)
|
||||||
|
|
||||||
|
# register a hook (function) to run after arguments are parsed.
|
||||||
|
hook.register('post_argument_parsing', wo_info_hook)
|
||||||
577
wo/cli/plugins/log.py
Normal file
577
wo/cli/plugins/log.py
Normal file
@@ -0,0 +1,577 @@
|
|||||||
|
"""Logfile Plugin for WordOps"""
|
||||||
|
|
||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from cement.core import handler, hook
|
||||||
|
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 wo.core.shellexec import WOShellExec
|
||||||
|
from wo.core.sendmail import WOSendMail
|
||||||
|
from wo.core.mysql import WOMysql
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
import gzip
|
||||||
|
|
||||||
|
|
||||||
|
def wo_log_hook(app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WOLogController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'log'
|
||||||
|
description = 'Perform operations on Nginx, PHP and MySQL log files'
|
||||||
|
stacked_on = 'base'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
usage = "wo log [<site_name>] [options]"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
self.app.args.print_help()
|
||||||
|
|
||||||
|
|
||||||
|
class WOLogShowController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'show'
|
||||||
|
description = 'Show Nginx, PHP, MySQL log file'
|
||||||
|
stacked_on = 'log'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
arguments = [
|
||||||
|
(['--all'],
|
||||||
|
dict(help='Show All logs file', action='store_true')),
|
||||||
|
(['--nginx'],
|
||||||
|
dict(help='Show Nginx Error logs file', action='store_true')),
|
||||||
|
(['--php'],
|
||||||
|
dict(help='Show PHP Error logs file', action='store_true')),
|
||||||
|
(['--fpm'],
|
||||||
|
dict(help='Show PHP5-fpm slow logs file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--mysql'],
|
||||||
|
dict(help='Show MySQL logs file', action='store_true')),
|
||||||
|
(['--wp'],
|
||||||
|
dict(help='Show Site specific WordPress logs file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--access'],
|
||||||
|
dict(help='Show Nginx access log file',
|
||||||
|
action='store_true')),
|
||||||
|
(['site_name'],
|
||||||
|
dict(help='Website Name', nargs='?', default=None))
|
||||||
|
]
|
||||||
|
usage = "wo log show [<site_name>] [options]"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
"""Default function of log show"""
|
||||||
|
self.msg = []
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.fpm)
|
||||||
|
and (not self.app.pargs.mysql) and (not self.app.pargs.access)
|
||||||
|
and (not self.app.pargs.wp) and (not self.app.pargs.site_name)):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.fpm = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
self.app.pargs.access = True
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.fpm)
|
||||||
|
and (not self.app.pargs.mysql) and (not self.app.pargs.access)
|
||||||
|
and (not self.app.pargs.wp) and (self.app.pargs.site_name)):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.wp = True
|
||||||
|
self.app.pargs.access = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx and (not self.app.pargs.site_name):
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*error.log"]
|
||||||
|
|
||||||
|
if self.app.pargs.access and (not self.app.pargs.site_name):
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*access.log"]
|
||||||
|
|
||||||
|
if self.app.pargs.fpm:
|
||||||
|
open('/var/log/php5/slow.log', 'a').close()
|
||||||
|
open('/var/log/php5/fpm.log', 'a').close()
|
||||||
|
self.msg = self.msg + ['/var/log/php5/slow.log',
|
||||||
|
'/var/log/php5/fpm.log']
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
# MySQL debug will not work for remote MySQL
|
||||||
|
if WOVariables.wo_mysql_host is "localhost":
|
||||||
|
if os.path.isfile('/var/log/mysql/mysql-slow.log'):
|
||||||
|
self.msg = self.msg + ['/var/log/mysql/mysql-slow.log']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL slow-log not found, skipped")
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, WordOps does not support"
|
||||||
|
"remote MySQL servers or log files")
|
||||||
|
|
||||||
|
if self.app.pargs.site_name:
|
||||||
|
webroot = "{0}{1}".format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)
|
||||||
|
|
||||||
|
if not os.path.isdir(webroot):
|
||||||
|
Log.error(self, "Site not present, quitting")
|
||||||
|
if self.app.pargs.access:
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/access.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/error.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
if self.app.pargs.wp:
|
||||||
|
if os.path.isdir('{0}/htdocs/wp-content'.format(webroot)):
|
||||||
|
if not os.path.isfile('{0}/logs/debug.log'
|
||||||
|
.format(webroot)):
|
||||||
|
if not os.path.isfile('{0}/htdocs/wp-content/debug.log'
|
||||||
|
.format(webroot)):
|
||||||
|
open("{0}/htdocs/wp-content/debug.log"
|
||||||
|
.format(webroot),
|
||||||
|
encoding='utf-8', mode='a').close()
|
||||||
|
WOShellExec.cmd_exec(self, "chown {1}: {0}/htdocs/"
|
||||||
|
"wp-content/debug.log"
|
||||||
|
"".format(webroot,
|
||||||
|
WOVariables
|
||||||
|
.wo_php_user)
|
||||||
|
)
|
||||||
|
# create symbolic link for debug log
|
||||||
|
WOFileUtils.create_symlink(self, ["{0}/htdocs/wp-content/"
|
||||||
|
"debug.log"
|
||||||
|
.format(webroot),
|
||||||
|
'{0}/logs/debug.log'
|
||||||
|
.format(webroot)])
|
||||||
|
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/debug.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
else:
|
||||||
|
Log.info(self, "Site is not WordPress site, skipping "
|
||||||
|
"WordPress logs")
|
||||||
|
|
||||||
|
watch_list = []
|
||||||
|
for w_list in self.msg:
|
||||||
|
watch_list = watch_list + glob.glob(w_list)
|
||||||
|
|
||||||
|
logwatch(self, watch_list)
|
||||||
|
|
||||||
|
|
||||||
|
class WOLogResetController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'reset'
|
||||||
|
description = 'Reset Nginx, PHP, MySQL log file'
|
||||||
|
stacked_on = 'log'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
arguments = [
|
||||||
|
(['--all'],
|
||||||
|
dict(help='Reset All logs file', action='store_true')),
|
||||||
|
(['--nginx'],
|
||||||
|
dict(help='Reset Nginx Error logs file', action='store_true')),
|
||||||
|
(['--php'],
|
||||||
|
dict(help='Reset PHP Error logs file', action='store_true')),
|
||||||
|
(['--fpm'],
|
||||||
|
dict(help='Reset PHP5-fpm slow logs file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--mysql'],
|
||||||
|
dict(help='Reset MySQL logs file', action='store_true')),
|
||||||
|
(['--wp'],
|
||||||
|
dict(help='Reset Site specific WordPress logs file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--access'],
|
||||||
|
dict(help='Reset Nginx access log file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--slow-log-db'],
|
||||||
|
dict(help='Drop all rows from slowlog table in database',
|
||||||
|
action='store_true')),
|
||||||
|
(['site_name'],
|
||||||
|
dict(help='Website Name', nargs='?', default=None))
|
||||||
|
]
|
||||||
|
usage = "wo log reset [<site_name>] [options]"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
"""Default function of log reset"""
|
||||||
|
self.msg = []
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.fpm)
|
||||||
|
and (not self.app.pargs.mysql) and (not self.app.pargs.access)
|
||||||
|
and (not self.app.pargs.wp) and (not self.app.pargs.site_name)
|
||||||
|
and (not self.app.pargs.slow_log_db)):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.fpm = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
self.app.pargs.access = True
|
||||||
|
self.app.pargs.slow_log_db = True
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.fpm)
|
||||||
|
and (not self.app.pargs.mysql) and (not self.app.pargs.access)
|
||||||
|
and (not self.app.pargs.wp) and (self.app.pargs.site_name)
|
||||||
|
and (not self.app.pargs.slow-log-db)):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.wp = True
|
||||||
|
self.app.pargs.access = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
|
||||||
|
if self.app.pargs.slow_log_db:
|
||||||
|
if os.path.isdir("/var/www/22222/htdocs/db/anemometer"):
|
||||||
|
Log.info(self, "Resetting MySQL slow_query_log database table")
|
||||||
|
WOMysql.execute(self, "TRUNCATE TABLE "
|
||||||
|
"slow_query_log.global_query_review_history")
|
||||||
|
WOMysql.execute(self, "TRUNCATE TABLE "
|
||||||
|
"slow_query_log.global_query_review")
|
||||||
|
|
||||||
|
if self.app.pargs.nginx and (not self.app.pargs.site_name):
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*error.log"]
|
||||||
|
|
||||||
|
if self.app.pargs.access and (not self.app.pargs.site_name):
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*access.log"]
|
||||||
|
|
||||||
|
if self.app.pargs.fpm:
|
||||||
|
open('/var/log/php5/slow.log', 'a').close()
|
||||||
|
open('/var/log/php5/fpm.log', 'a').close()
|
||||||
|
self.msg = self.msg + ['/var/log/php5/slow.log',
|
||||||
|
'/var/log/php5/fpm.log']
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
# MySQL debug will not work for remote MySQL
|
||||||
|
if WOVariables.wo_mysql_host is "localhost":
|
||||||
|
if os.path.isfile('/var/log/mysql/mysql-slow.log'):
|
||||||
|
self.msg = self.msg + ['/var/log/mysql/mysql-slow.log']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL slow-log not found, skipped")
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, WordOps does not support"
|
||||||
|
"remote MySQL servers or log files")
|
||||||
|
|
||||||
|
if self.app.pargs.site_name:
|
||||||
|
webroot = "{0}{1}".format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)
|
||||||
|
|
||||||
|
if not os.path.isdir(webroot):
|
||||||
|
Log.error(self, "Site not present, quitting")
|
||||||
|
if self.app.pargs.access:
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/access.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/error.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
if self.app.pargs.wp:
|
||||||
|
if os.path.isdir('{0}/htdocs/wp-content'.format(webroot)):
|
||||||
|
if not os.path.isfile('{0}/logs/debug.log'
|
||||||
|
.format(webroot)):
|
||||||
|
if not os.path.isfile('{0}/htdocs/wp-content/debug.log'
|
||||||
|
.format(webroot)):
|
||||||
|
open("{0}/htdocs/wp-content/debug.log"
|
||||||
|
.format(webroot),
|
||||||
|
encoding='utf-8', mode='a').close()
|
||||||
|
WOShellExec.cmd_exec(self, "chown {1}: {0}/htdocs/"
|
||||||
|
"wp-content/debug.log"
|
||||||
|
"".format(webroot,
|
||||||
|
WOVariables
|
||||||
|
.wo_php_user)
|
||||||
|
)
|
||||||
|
# create symbolic link for debug log
|
||||||
|
WOFileUtils.create_symlink(self, ["{0}/htdocs/wp-content/"
|
||||||
|
"debug.log"
|
||||||
|
.format(webroot),
|
||||||
|
'{0}/logs/debug.log'
|
||||||
|
.format(webroot)])
|
||||||
|
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/debug.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
else:
|
||||||
|
Log.info(self, "Site is not WordPress site, skipping "
|
||||||
|
"WordPress logs")
|
||||||
|
|
||||||
|
reset_list = []
|
||||||
|
for r_list in self.msg:
|
||||||
|
reset_list = reset_list + glob.glob(r_list)
|
||||||
|
|
||||||
|
# Clearing content of file
|
||||||
|
for r_list in reset_list:
|
||||||
|
Log.info(self, "Resetting file {file}".format(file=r_list))
|
||||||
|
open(r_list, 'w').close()
|
||||||
|
|
||||||
|
|
||||||
|
class WOLogGzipController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'gzip'
|
||||||
|
description = 'GZip Nginx, PHP, MySQL log file'
|
||||||
|
stacked_on = 'log'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
arguments = [
|
||||||
|
(['--all'],
|
||||||
|
dict(help='GZip All logs file', action='store_true')),
|
||||||
|
(['--nginx'],
|
||||||
|
dict(help='GZip Nginx Error logs file', action='store_true')),
|
||||||
|
(['--php'],
|
||||||
|
dict(help='GZip PHP Error logs file', action='store_true')),
|
||||||
|
(['--fpm'],
|
||||||
|
dict(help='GZip PHP5-fpm slow logs file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--mysql'],
|
||||||
|
dict(help='GZip MySQL logs file', action='store_true')),
|
||||||
|
(['--wp'],
|
||||||
|
dict(help='GZip Site specific WordPress logs file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--access'],
|
||||||
|
dict(help='GZip Nginx access log file',
|
||||||
|
action='store_true')),
|
||||||
|
(['site_name'],
|
||||||
|
dict(help='Website Name', nargs='?', default=None))
|
||||||
|
]
|
||||||
|
usage = "wo log gzip [<site_name>] [options]"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
"""Default function of log GZip"""
|
||||||
|
self.msg = []
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.fpm)
|
||||||
|
and (not self.app.pargs.mysql) and (not self.app.pargs.access)
|
||||||
|
and (not self.app.pargs.wp) and (not self.app.pargs.site_name)):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.fpm = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
self.app.pargs.access = True
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.fpm)
|
||||||
|
and (not self.app.pargs.mysql) and (not self.app.pargs.access)
|
||||||
|
and (not self.app.pargs.wp) and (self.app.pargs.site_name)):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.wp = True
|
||||||
|
self.app.pargs.access = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx and (not self.app.pargs.site_name):
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*error.log"]
|
||||||
|
|
||||||
|
if self.app.pargs.access and (not self.app.pargs.site_name):
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*access.log"]
|
||||||
|
|
||||||
|
if self.app.pargs.fpm:
|
||||||
|
open('/var/log/php5/slow.log', 'a').close()
|
||||||
|
open('/var/log/php5/fpm.log', 'a').close()
|
||||||
|
self.msg = self.msg + ['/var/log/php5/slow.log',
|
||||||
|
'/var/log/php5/fpm.log']
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
# MySQL debug will not work for remote MySQL
|
||||||
|
if WOVariables.wo_mysql_host is "localhost":
|
||||||
|
if os.path.isfile('/var/log/mysql/mysql-slow.log'):
|
||||||
|
self.msg = self.msg + ['/var/log/mysql/mysql-slow.log']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL slow-log not found, skipped")
|
||||||
|
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, WordOps does not support"
|
||||||
|
"remote MySQL servers or log files")
|
||||||
|
|
||||||
|
if self.app.pargs.site_name:
|
||||||
|
webroot = "{0}{1}".format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)
|
||||||
|
|
||||||
|
if not os.path.isdir(webroot):
|
||||||
|
Log.error(self, "Site not present, quitting")
|
||||||
|
if self.app.pargs.access:
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/access.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/error.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
if self.app.pargs.wp:
|
||||||
|
if os.path.isdir('{0}/htdocs/wp-content'.format(webroot)):
|
||||||
|
if not os.path.isfile('{0}/logs/debug.log'
|
||||||
|
.format(webroot)):
|
||||||
|
if not os.path.isfile('{0}/htdocs/wp-content/debug.log'
|
||||||
|
.format(webroot)):
|
||||||
|
open("{0}/htdocs/wp-content/debug.log"
|
||||||
|
.format(webroot),
|
||||||
|
encoding='utf-8', mode='a').close()
|
||||||
|
WOShellExec.cmd_exec(self, "chown {1}: {0}/htdocs/"
|
||||||
|
"wp-content/debug.log"
|
||||||
|
"".format(webroot,
|
||||||
|
WOVariables
|
||||||
|
.wo_php_user)
|
||||||
|
)
|
||||||
|
# create symbolic link for debug log
|
||||||
|
WOFileUtils.create_symlink(self, ["{0}/htdocs/wp-content/"
|
||||||
|
"debug.log"
|
||||||
|
.format(webroot),
|
||||||
|
'{0}/logs/debug.log'
|
||||||
|
.format(webroot)])
|
||||||
|
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/debug.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
else:
|
||||||
|
Log.info(self, "Site is not WordPress site, skipping "
|
||||||
|
"WordPress logs")
|
||||||
|
|
||||||
|
gzip_list = []
|
||||||
|
for g_list in self.msg:
|
||||||
|
gzip_list = gzip_list + glob.glob(g_list)
|
||||||
|
|
||||||
|
# Gzip content of file
|
||||||
|
for g_list in gzip_list:
|
||||||
|
Log.info(self, "Gzipping file {file}".format(file=g_list))
|
||||||
|
in_file = g_list
|
||||||
|
in_data = open(in_file, "rb").read()
|
||||||
|
out_gz = g_list + ".gz"
|
||||||
|
gzf = gzip.open(out_gz, "wb")
|
||||||
|
gzf.write(in_data)
|
||||||
|
gzf.close()
|
||||||
|
|
||||||
|
|
||||||
|
class WOLogMailController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'mail'
|
||||||
|
description = 'Mail Nginx, PHP, MySQL log file'
|
||||||
|
stacked_on = 'log'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
arguments = [
|
||||||
|
(['--all'],
|
||||||
|
dict(help='Mail All logs file', action='store_true')),
|
||||||
|
(['--nginx'],
|
||||||
|
dict(help='Mail Nginx Error logs file', action='store_true')),
|
||||||
|
(['--php'],
|
||||||
|
dict(help='Mail PHP Error logs file', action='store_true')),
|
||||||
|
(['--fpm'],
|
||||||
|
dict(help='Mail PHP5-fpm slow logs file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--mysql'],
|
||||||
|
dict(help='Mail MySQL logs file', action='store_true')),
|
||||||
|
(['--wp'],
|
||||||
|
dict(help='Mail Site specific WordPress logs file',
|
||||||
|
action='store_true')),
|
||||||
|
(['--access'],
|
||||||
|
dict(help='Mail Nginx access log file',
|
||||||
|
action='store_true')),
|
||||||
|
(['site_name'],
|
||||||
|
dict(help='Website Name', nargs='?', default=None)),
|
||||||
|
(['--to'],
|
||||||
|
dict(help='Email addresses to send log files', action='append',
|
||||||
|
dest='to', nargs=1, required=True)),
|
||||||
|
]
|
||||||
|
usage = "wo log mail [<site_name>] [options]"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
"""Default function of log Mail"""
|
||||||
|
self.msg = []
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.fpm)
|
||||||
|
and (not self.app.pargs.mysql) and (not self.app.pargs.access)
|
||||||
|
and (not self.app.pargs.wp) and (not self.app.pargs.site_name)):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.fpm = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
self.app.pargs.access = True
|
||||||
|
|
||||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.fpm)
|
||||||
|
and (not self.app.pargs.mysql) and (not self.app.pargs.access)
|
||||||
|
and (not self.app.pargs.wp) and (self.app.pargs.site_name)):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.wp = True
|
||||||
|
self.app.pargs.access = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx and (not self.app.pargs.site_name):
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*error.log"]
|
||||||
|
|
||||||
|
if self.app.pargs.access and (not self.app.pargs.site_name):
|
||||||
|
self.msg = self.msg + ["/var/log/nginx/*access.log"]
|
||||||
|
|
||||||
|
if self.app.pargs.fpm:
|
||||||
|
open('/var/log/php5/slow.log', 'a').close()
|
||||||
|
open('/var/log/php5/fpm.log', 'a').close()
|
||||||
|
self.msg = self.msg + ['/var/log/php5/slow.log',
|
||||||
|
'/var/log/php5/fpm.log']
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
# MySQL debug will not work for remote MySQL
|
||||||
|
if WOVariables.wo_mysql_host is "localhost":
|
||||||
|
if os.path.isfile('/var/log/mysql/mysql-slow.log'):
|
||||||
|
self.msg = self.msg + ['/var/log/mysql/mysql-slow.log']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL slow-log not found, skipped")
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, WordOps does not support"
|
||||||
|
"remote MySQL servers or log files")
|
||||||
|
|
||||||
|
if self.app.pargs.site_name:
|
||||||
|
webroot = "{0}{1}".format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)
|
||||||
|
|
||||||
|
if not os.path.isdir(webroot):
|
||||||
|
Log.error(self, "Site not present, quitting")
|
||||||
|
if self.app.pargs.access:
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/access.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/error.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
if self.app.pargs.wp:
|
||||||
|
if os.path.isdir('{0}/htdocs/wp-content'.format(webroot)):
|
||||||
|
if not os.path.isfile('{0}/logs/debug.log'
|
||||||
|
.format(webroot)):
|
||||||
|
if not os.path.isfile('{0}/htdocs/wp-content/debug.log'
|
||||||
|
.format(webroot)):
|
||||||
|
open("{0}/htdocs/wp-content/debug.log"
|
||||||
|
.format(webroot),
|
||||||
|
encoding='utf-8', mode='a').close()
|
||||||
|
WOShellExec.cmd_exec(self, "chown {1}: {0}/htdocs/"
|
||||||
|
"wp-content/debug.log"
|
||||||
|
"".format(webroot,
|
||||||
|
WOVariables
|
||||||
|
.wo_php_user)
|
||||||
|
)
|
||||||
|
# create symbolic link for debug log
|
||||||
|
WOFileUtils.create_symlink(self, ["{0}/htdocs/wp-content/"
|
||||||
|
"debug.log"
|
||||||
|
.format(webroot),
|
||||||
|
'{0}/logs/debug.log'
|
||||||
|
.format(webroot)])
|
||||||
|
|
||||||
|
self.msg = self.msg + ["{0}/{1}/logs/debug.log"
|
||||||
|
.format(WOVariables.wo_webroot,
|
||||||
|
self.app.pargs.site_name)]
|
||||||
|
else:
|
||||||
|
Log.info(self, "Site is not WordPress site, skipping "
|
||||||
|
"WordPress logs")
|
||||||
|
|
||||||
|
mail_list = []
|
||||||
|
for m_list in self.msg:
|
||||||
|
mail_list = mail_list + glob.glob(m_list)
|
||||||
|
|
||||||
|
for tomail in self.app.pargs.to:
|
||||||
|
Log.info(self, "Sending mail to {0}".format(tomail[0]))
|
||||||
|
WOSendMail("wordops", tomail[0], "{0} Log Files"
|
||||||
|
.format(WOVariables.wo_fqdn),
|
||||||
|
"Hi,\n The requested logfiles are attached."
|
||||||
|
"\n\nBest regards,\nYour WordOps worker",
|
||||||
|
files=mail_list, port=25, isTls=False)
|
||||||
|
|
||||||
|
|
||||||
|
def load(app):
|
||||||
|
# register the plugin class.. this only happens if the plugin is enabled
|
||||||
|
handler.register(WOLogController)
|
||||||
|
handler.register(WOLogShowController)
|
||||||
|
handler.register(WOLogResetController)
|
||||||
|
handler.register(WOLogGzipController)
|
||||||
|
handler.register(WOLogMailController)
|
||||||
|
# register a hook (function) to run after arguments are parsed.
|
||||||
|
hook.register('post_argument_parsing', wo_log_hook)
|
||||||
57
wo/cli/plugins/models.py
Normal file
57
wo/cli/plugins/models.py
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
from sqlalchemy import Column, DateTime, String, Integer, Boolean, func
|
||||||
|
from wo.core.database import Base
|
||||||
|
|
||||||
|
|
||||||
|
class SiteDB(Base):
|
||||||
|
"""
|
||||||
|
Database model for site table
|
||||||
|
"""
|
||||||
|
__tablename__ = 'sites'
|
||||||
|
__table_args__ = {'extend_existing': True}
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
sitename = Column(String, unique=True)
|
||||||
|
|
||||||
|
site_type = Column(String)
|
||||||
|
cache_type = Column(String)
|
||||||
|
site_path = Column(String)
|
||||||
|
|
||||||
|
# Use default=func.now() to set the default created time
|
||||||
|
# of a site to be the current time when a
|
||||||
|
# Site record was created
|
||||||
|
|
||||||
|
created_on = Column(DateTime, default=func.now())
|
||||||
|
is_enabled = Column(Boolean, unique=False, default=True, nullable=False)
|
||||||
|
is_ssl = Column(Boolean, unique=False, default=False)
|
||||||
|
storage_fs = Column(String)
|
||||||
|
storage_db = Column(String)
|
||||||
|
db_name = Column(String)
|
||||||
|
db_user = Column(String)
|
||||||
|
db_password = Column(String)
|
||||||
|
db_host = Column(String)
|
||||||
|
is_hhvm = Column(Boolean, unique=False, default=False)
|
||||||
|
php_version = Column(String)
|
||||||
|
|
||||||
|
def __init__(self, sitename=None, site_type=None, cache_type=None,
|
||||||
|
site_path=None, site_enabled=None,
|
||||||
|
is_ssl=None, storage_fs=None, storage_db=None, db_name=None,
|
||||||
|
db_user=None, db_password=None, db_host='localhost',
|
||||||
|
hhvm=None, php_version=None):
|
||||||
|
self.sitename = sitename
|
||||||
|
self.site_type = site_type
|
||||||
|
self.cache_type = cache_type
|
||||||
|
self.site_path = site_path
|
||||||
|
self.is_enabled = site_enabled
|
||||||
|
self.is_ssl = is_ssl
|
||||||
|
self.storage_fs = storage_fs
|
||||||
|
self.storage_db = storage_db
|
||||||
|
self.db_name = db_name
|
||||||
|
self.db_user = db_user
|
||||||
|
self.db_password = db_password
|
||||||
|
self.db_host = db_host
|
||||||
|
self.is_hhvm = hhvm
|
||||||
|
self.php_version = php_version
|
||||||
|
# def __repr__(self):
|
||||||
|
# return '<Site %r>' % (self.site_type)
|
||||||
|
#
|
||||||
|
# def getType(self):
|
||||||
|
# return '%r>' % (self.site_type)
|
||||||
141
wo/cli/plugins/secure.py
Normal file
141
wo/cli/plugins/secure.py
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
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.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 sys
|
||||||
|
import hashlib
|
||||||
|
import getpass
|
||||||
|
|
||||||
|
|
||||||
|
def wo_secure_hook(app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WOSecureController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'secure'
|
||||||
|
stacked_on = 'base'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
description = ('Secure command secure auth, ip and port')
|
||||||
|
arguments = [
|
||||||
|
(['--auth'],
|
||||||
|
dict(help='secure auth', action='store_true')),
|
||||||
|
(['--port'],
|
||||||
|
dict(help='secure port', action='store_true')),
|
||||||
|
(['--ip'],
|
||||||
|
dict(help='secure ip', action='store_true')),
|
||||||
|
(['user_input'],
|
||||||
|
dict(help='user input', nargs='?', default=None)),
|
||||||
|
(['user_pass'],
|
||||||
|
dict(help='user pass', nargs='?', default=None))]
|
||||||
|
usage = "wo secure [options]"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
if self.app.pargs.auth:
|
||||||
|
self.secure_auth()
|
||||||
|
if self.app.pargs.port:
|
||||||
|
self.secure_port()
|
||||||
|
if self.app.pargs.ip:
|
||||||
|
self.secure_ip()
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def secure_auth(self):
|
||||||
|
"""This function secures authentication"""
|
||||||
|
passwd = ''.join([random.choice
|
||||||
|
(string.ascii_letters + string.digits)
|
||||||
|
for n in range(6)])
|
||||||
|
if not self.app.pargs.user_input:
|
||||||
|
username = input("Provide HTTP authentication user "
|
||||||
|
"name [{0}] :".format(WOVariables.wo_user))
|
||||||
|
self.app.pargs.user_input = username
|
||||||
|
if username == "":
|
||||||
|
self.app.pargs.user_input = WOVariables.wo_user
|
||||||
|
if not self.app.pargs.user_pass:
|
||||||
|
password = getpass.getpass("Provide HTTP authentication "
|
||||||
|
"password [{0}] :".format(passwd))
|
||||||
|
self.app.pargs.user_pass = password
|
||||||
|
if password == "":
|
||||||
|
self.app.pargs.user_pass = passwd
|
||||||
|
Log.debug(self, "printf username:"
|
||||||
|
"$(openssl passwd -crypt "
|
||||||
|
"password 2> /dev/null)\n\""
|
||||||
|
"> /etc/nginx/htpasswd-wo 2>/dev/null")
|
||||||
|
WOShellExec.cmd_exec(self, "printf \"{username}:"
|
||||||
|
"$(openssl passwd -crypt "
|
||||||
|
"{password} 2> /dev/null)\n\""
|
||||||
|
"> /etc/nginx/htpasswd-wo 2>/dev/null"
|
||||||
|
.format(username=self.app.pargs.user_input,
|
||||||
|
password=self.app.pargs.user_pass),
|
||||||
|
log=False)
|
||||||
|
WOGit.add(self, ["/etc/nginx"],
|
||||||
|
msg="Adding changed secure auth into Git")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def secure_port(self):
|
||||||
|
"""This function Secures port"""
|
||||||
|
if self.app.pargs.user_input:
|
||||||
|
while not self.app.pargs.user_input.isdigit():
|
||||||
|
Log.info(self, "Please enter a valid port number ")
|
||||||
|
self.app.pargs.user_input = input("WordOps "
|
||||||
|
"admin port [22222]:")
|
||||||
|
if not self.app.pargs.user_input:
|
||||||
|
port = input("WordOps admin port [22222]:")
|
||||||
|
if port == "":
|
||||||
|
self.app.pargs.user_input = 22222
|
||||||
|
while not port.isdigit() and port != "":
|
||||||
|
Log.info(self, "Please Enter valid port number :")
|
||||||
|
port = input("WordOps admin port [22222]:")
|
||||||
|
self.app.pargs.user_input = port
|
||||||
|
if WOVariables.wo_platform_distro == 'ubuntu':
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"s/listen.*/listen "
|
||||||
|
"{port} default_server ssl http2;/\" "
|
||||||
|
"/etc/nginx/sites-available/22222"
|
||||||
|
.format(port=self.app.pargs.user_input))
|
||||||
|
if WOVariables.wo_platform_distro == 'debian':
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i \"s/listen.*/listen "
|
||||||
|
"{port} default_server ssl http2;/\" "
|
||||||
|
"/etc/nginx/sites-available/22222"
|
||||||
|
.format(port=self.app.pargs.user_input))
|
||||||
|
WOGit.add(self, ["/etc/nginx"],
|
||||||
|
msg="Adding changed secure port into Git")
|
||||||
|
if not WOService.reload_service(self, 'nginx'):
|
||||||
|
Log.error(self, "service nginx reload failed. "
|
||||||
|
"check issues with `nginx -t` command")
|
||||||
|
Log.info(self, "Successfully port changed {port}"
|
||||||
|
.format(port=self.app.pargs.user_input))
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def secure_ip(self):
|
||||||
|
"""IP whitelisting"""
|
||||||
|
newlist = []
|
||||||
|
if not self.app.pargs.user_input:
|
||||||
|
ip = input("Enter the comma separated IP addresses "
|
||||||
|
"to white list [127.0.0.1]:")
|
||||||
|
self.app.pargs.user_input = ip
|
||||||
|
try:
|
||||||
|
user_ip = self.app.pargs.user_input.split(',')
|
||||||
|
except Exception as e:
|
||||||
|
user_ip = ['127.0.0.1']
|
||||||
|
for ip_addr in user_ip:
|
||||||
|
if not ("exist_ip_address "+ip_addr in open('/etc/nginx/common/'
|
||||||
|
'acl.conf').read()):
|
||||||
|
WOShellExec.cmd_exec(self, "sed -i "
|
||||||
|
"\"/deny/i allow {whitelist_address}\;\""
|
||||||
|
" /etc/nginx/common/acl.conf"
|
||||||
|
.format(whitelist_address=ip_addr))
|
||||||
|
WOGit.add(self, ["/etc/nginx"],
|
||||||
|
msg="Adding changed secure ip into Git")
|
||||||
|
|
||||||
|
Log.info(self, "Successfully added IP address in acl.conf file")
|
||||||
|
|
||||||
|
|
||||||
|
def load(app):
|
||||||
|
handler.register(WOSecureController)
|
||||||
|
hook.register('post_argument_parsing', wo_secure_hook)
|
||||||
1735
wo/cli/plugins/site.py
Normal file
1735
wo/cli/plugins/site.py
Normal file
File diff suppressed because it is too large
Load Diff
1439
wo/cli/plugins/site_functions.py
Normal file
1439
wo/cli/plugins/site_functions.py
Normal file
File diff suppressed because it is too large
Load Diff
126
wo/cli/plugins/sitedb.py
Normal file
126
wo/cli/plugins/sitedb.py
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
from sqlalchemy import Column, DateTime, String, Integer, Boolean
|
||||||
|
from sqlalchemy import ForeignKey, func
|
||||||
|
from sqlalchemy.orm import relationship, backref
|
||||||
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
|
from wo.core.logging import Log
|
||||||
|
from wo.core.database import db_session
|
||||||
|
from wo.cli.plugins.models import SiteDB
|
||||||
|
import sys
|
||||||
|
import glob
|
||||||
|
|
||||||
|
|
||||||
|
def addNewSite(self, site, stype, cache, path,
|
||||||
|
enabled=True, ssl=False, fs='ext4', db='mysql',
|
||||||
|
db_name=None, db_user=None, db_password=None,
|
||||||
|
db_host='localhost', hhvm=0, php_version='5.5'):
|
||||||
|
"""
|
||||||
|
Add New Site record information into the wo database.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
newRec = SiteDB(site, stype, cache, path, enabled, ssl, fs, db,
|
||||||
|
db_name, db_user, db_password, db_host, hhvm,
|
||||||
|
php_version)
|
||||||
|
db_session.add(newRec)
|
||||||
|
db_session.commit()
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.error(self, "Unable to add site to database")
|
||||||
|
|
||||||
|
|
||||||
|
def getSiteInfo(self, site):
|
||||||
|
"""
|
||||||
|
Retrieves site record from ee databse
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
q = SiteDB.query.filter(SiteDB.sitename == site).first()
|
||||||
|
return q
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.error(self, "Unable to query database for site info")
|
||||||
|
|
||||||
|
|
||||||
|
def updateSiteInfo(self, site, stype='', cache='', webroot='',
|
||||||
|
enabled=True, ssl=False, fs='', db='', db_name=None,
|
||||||
|
db_user=None, db_password=None, db_host=None, hhvm=None,
|
||||||
|
php_version=''):
|
||||||
|
"""updates site record in database"""
|
||||||
|
try:
|
||||||
|
q = SiteDB.query.filter(SiteDB.sitename == site).first()
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.error(self, "Unable to query database for site info")
|
||||||
|
|
||||||
|
if not q:
|
||||||
|
Log.error(self, "{0} does not exist in database".format(site))
|
||||||
|
|
||||||
|
# Check if new record matches old if not then only update database
|
||||||
|
if stype and q.site_type != stype:
|
||||||
|
q.site_type = stype
|
||||||
|
|
||||||
|
if cache and q.cache_type != cache:
|
||||||
|
q.cache_type = cache
|
||||||
|
|
||||||
|
if q.is_enabled != enabled:
|
||||||
|
q.is_enabled = enabled
|
||||||
|
|
||||||
|
if q.is_ssl != ssl:
|
||||||
|
q.is_ssl = ssl
|
||||||
|
|
||||||
|
if db_name and q.db_name != db_name:
|
||||||
|
q.db_name = db_name
|
||||||
|
|
||||||
|
if db_user and q.db_user != db_user:
|
||||||
|
q.db_user = db_user
|
||||||
|
|
||||||
|
if db_user and q.db_password != db_password:
|
||||||
|
q.db_password = db_password
|
||||||
|
|
||||||
|
if db_host and q.db_host != db_host:
|
||||||
|
q.db_host = db_host
|
||||||
|
|
||||||
|
if webroot and q.site_path != webroot:
|
||||||
|
q.site_path = webroot
|
||||||
|
|
||||||
|
if (hhvm is not None) and (q.is_hhvm is not hhvm):
|
||||||
|
q.is_hhvm = hhvm
|
||||||
|
|
||||||
|
if php_version and q.php_version != php_version:
|
||||||
|
q.php_version = php_version
|
||||||
|
|
||||||
|
try:
|
||||||
|
q.created_on = func.now()
|
||||||
|
db_session.commit()
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.error(self, "Unable to update site info in application database.")
|
||||||
|
|
||||||
|
|
||||||
|
def deleteSiteInfo(self, site):
|
||||||
|
"""Delete site record in database"""
|
||||||
|
try:
|
||||||
|
q = SiteDB.query.filter(SiteDB.sitename == site).first()
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.error(self, "Unable to query database")
|
||||||
|
|
||||||
|
if not q:
|
||||||
|
Log.error(self, "{0} does not exist in database".format(site))
|
||||||
|
|
||||||
|
try:
|
||||||
|
db_session.delete(q)
|
||||||
|
db_session.commit()
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.error(self, "Unable to delete site from application database.")
|
||||||
|
|
||||||
|
|
||||||
|
def getAllsites(self):
|
||||||
|
"""
|
||||||
|
1. returns all records from ee database
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
q = SiteDB.query.all()
|
||||||
|
return q
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, "{0}".format(e))
|
||||||
|
Log.error(self, "Unable to query database")
|
||||||
2047
wo/cli/plugins/stack.py
Normal file
2047
wo/cli/plugins/stack.py
Normal file
File diff suppressed because it is too large
Load Diff
115
wo/cli/plugins/stack_migrate.py
Normal file
115
wo/cli/plugins/stack_migrate.py
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from cement.core import handler, hook
|
||||||
|
from wo.core.mysql import WOMysql
|
||||||
|
from wo.core.logging import Log
|
||||||
|
from wo.core.variables import WOVariables
|
||||||
|
from wo.core.aptget import WOAptGet
|
||||||
|
from wo.core.shellexec import WOShellExec
|
||||||
|
from wo.core.apt_repo import WORepo
|
||||||
|
from wo.core.services import WOService
|
||||||
|
import configparser
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class WOStackMigrateController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'migrate'
|
||||||
|
stacked_on = 'stack'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
description = ('Migrate stack safely')
|
||||||
|
arguments = [
|
||||||
|
(['--mariadb'],
|
||||||
|
dict(help="Migrate database to MariaDB",
|
||||||
|
action='store_true')),
|
||||||
|
]
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def migrate_mariadb(self):
|
||||||
|
# Backup all database
|
||||||
|
WOMysql.backupAll(self)
|
||||||
|
|
||||||
|
# Add MariaDB repo
|
||||||
|
Log.info(self, "Adding repository for MariaDB, please wait...")
|
||||||
|
|
||||||
|
mysql_pref = ("Package: *\nPin: origin sfo1.mirrors.digitalocean.com"
|
||||||
|
"\nPin-Priority: 1000\n")
|
||||||
|
with open('/etc/apt/preferences.d/'
|
||||||
|
'MariaDB.pref', 'w') as mysql_pref_file:
|
||||||
|
mysql_pref_file.write(mysql_pref)
|
||||||
|
|
||||||
|
WORepo.add(self, repo_url=WOVariables.wo_mysql_repo)
|
||||||
|
Log.debug(self, 'Adding key for {0}'
|
||||||
|
.format(WOVariables.wo_mysql_repo))
|
||||||
|
WORepo.add_key(self, '0xcbcb082a1bb943db',
|
||||||
|
keyserver="keyserver.ubuntu.com")
|
||||||
|
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
if os.path.exists('/etc/mysql/conf.d/my.cnf'):
|
||||||
|
config.read('/etc/mysql/conf.d/my.cnf')
|
||||||
|
else:
|
||||||
|
config.read(os.path.expanduser("~")+'/.my.cnf')
|
||||||
|
|
||||||
|
try:
|
||||||
|
chars = config['client']['password']
|
||||||
|
except Exception as e:
|
||||||
|
Log.error(self, "Error: process exited with error %s"
|
||||||
|
% e)
|
||||||
|
|
||||||
|
Log.debug(self, "Pre-seeding MariaDB")
|
||||||
|
Log.debug(self, "echo \"mariadb-server-10.0 "
|
||||||
|
"mysql-server/root_password "
|
||||||
|
"password \" | "
|
||||||
|
"debconf-set-selections")
|
||||||
|
WOShellExec.cmd_exec(self, "echo \"mariadb-server-10.0 "
|
||||||
|
"mysql-server/root_password "
|
||||||
|
"password {chars}\" | "
|
||||||
|
"debconf-set-selections"
|
||||||
|
.format(chars=chars),
|
||||||
|
log=False)
|
||||||
|
Log.debug(self, "echo \"mariadb-server-10.0 "
|
||||||
|
"mysql-server/root_password_again "
|
||||||
|
"password \" | "
|
||||||
|
"debconf-set-selections")
|
||||||
|
WOShellExec.cmd_exec(self, "echo \"mariadb-server-10.0 "
|
||||||
|
"mysql-server/root_password_again "
|
||||||
|
"password {chars}\" | "
|
||||||
|
"debconf-set-selections"
|
||||||
|
.format(chars=chars),
|
||||||
|
log=False)
|
||||||
|
|
||||||
|
# Install MariaDB
|
||||||
|
apt_packages = WOVariables.wo_mysql
|
||||||
|
|
||||||
|
# If PHP is installed then install php5-mysql
|
||||||
|
if WOAptGet.is_installed(self, "php5-fpm"):
|
||||||
|
apt_packages = apt_packages + ["php5-mysql"]
|
||||||
|
|
||||||
|
Log.info(self, "Updating apt-cache, hang on...")
|
||||||
|
WOAptGet.update(self)
|
||||||
|
Log.info(self, "Installing MariaDB, hang on...")
|
||||||
|
WOAptGet.remove(self, ["mysql-common", "libmysqlclient18"])
|
||||||
|
WOAptGet.auto_remove(self)
|
||||||
|
WOAptGet.install(self, apt_packages)
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
if ((not self.app.pargs.mariadb)):
|
||||||
|
self.app.args.print_help()
|
||||||
|
if self.app.pargs.mariadb:
|
||||||
|
if WOVariables.wo_mysql_host is not "localhost":
|
||||||
|
Log.error(self, "Remote MySQL server in use, skipping local install")
|
||||||
|
|
||||||
|
if WOShellExec.cmd_exec(self, "mysqladmin ping") and (not
|
||||||
|
WOAptGet.is_installed(self, 'mariadb-server')):
|
||||||
|
|
||||||
|
Log.info(self, "If your database size is big, "
|
||||||
|
"migration may take some time.")
|
||||||
|
Log.info(self, "During migration non nginx-cached parts of "
|
||||||
|
"your site may remain down")
|
||||||
|
start_migrate = input("Type \"mariadb\" to continue:")
|
||||||
|
if start_migrate != "mariadb":
|
||||||
|
Log.error(self, "Not starting migration")
|
||||||
|
self.migrate_mariadb()
|
||||||
|
else:
|
||||||
|
Log.error(self, "Your current MySQL is not alive or "
|
||||||
|
"you allready installed MariaDB")
|
||||||
403
wo/cli/plugins/stack_services.py
Normal file
403
wo/cli/plugins/stack_services.py
Normal file
@@ -0,0 +1,403 @@
|
|||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from cement.core import handler, hook
|
||||||
|
from wo.core.services import WOService
|
||||||
|
from wo.core.logging import Log
|
||||||
|
from wo.core.variables import WOVariables
|
||||||
|
from wo.core.aptget import WOAptGet
|
||||||
|
|
||||||
|
|
||||||
|
class WOStackStatusController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'stack_services'
|
||||||
|
stacked_on = 'stack'
|
||||||
|
stacked_type = 'embedded'
|
||||||
|
description = 'Check the stack status'
|
||||||
|
arguments = [
|
||||||
|
(['--memcache'],
|
||||||
|
dict(help='start/stop/restart memcache', action='store_true')),
|
||||||
|
]
|
||||||
|
|
||||||
|
@expose(help="Start stack services")
|
||||||
|
def start(self):
|
||||||
|
"""Start services"""
|
||||||
|
services = []
|
||||||
|
if not (self.app.pargs.nginx or self.app.pargs.php or self.app.pargs.php7
|
||||||
|
or self.app.pargs.mysql or self.app.pargs.hhvm or self.app.pargs.memcache
|
||||||
|
or self.app.pargs.redis):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.php = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
if WOAptGet.is_installed(self, 'nginx-custom') or WOAptGet.is_installed(self,'nginx-mainline'):
|
||||||
|
services = services + ['nginx']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
if (WOVariables.wo_platform_distro == 'debian' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
if WOAptGet.is_installed(self, 'php5-fpm'):
|
||||||
|
services = services + ['php5-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5-FPM is not installed")
|
||||||
|
else:
|
||||||
|
if WOAptGet.is_installed(self, 'php5.6-fpm'):
|
||||||
|
services = services + ['php5.6-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5.6-FPM is not installed")
|
||||||
|
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php7:
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic'):
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
else:
|
||||||
|
Log.info(self, "Your platform does not support PHP 7")
|
||||||
|
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
if ((WOVariables.wo_mysql_host is "localhost") or
|
||||||
|
(WOVariables.wo_mysql_host is "127.0.0.1")):
|
||||||
|
if (WOAptGet.is_installed(self, 'mysql-server') or
|
||||||
|
WOAptGet.is_installed(self, 'percona-server-server-5.6') or
|
||||||
|
WOAptGet.is_installed(self, 'mariadb-server')):
|
||||||
|
services = services + ['mysql']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL is not installed")
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, "
|
||||||
|
"Unable to check MySQL service status")
|
||||||
|
|
||||||
|
if self.app.pargs.hhvm:
|
||||||
|
if WOAptGet.is_installed(self, 'hhvm'):
|
||||||
|
services = services + ['hhvm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "HHVM is not installed")
|
||||||
|
if self.app.pargs.memcache:
|
||||||
|
if WOAptGet.is_installed(self, 'memcached'):
|
||||||
|
services = services + ['memcached']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Memcache is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.redis:
|
||||||
|
if WOAptGet.is_installed(self, 'redis-server'):
|
||||||
|
services = services + ['redis-server']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Redis server is not installed")
|
||||||
|
|
||||||
|
for service in services:
|
||||||
|
Log.debug(self, "Starting service: {0}".format(service))
|
||||||
|
WOService.start_service(self, service)
|
||||||
|
|
||||||
|
@expose(help="Stop stack services")
|
||||||
|
def stop(self):
|
||||||
|
"""Stop services"""
|
||||||
|
services = []
|
||||||
|
if not (self.app.pargs.nginx or self.app.pargs.php or self.app.pargs.php7
|
||||||
|
or self.app.pargs.mysql or self.app.pargs.hhvm or self.app.pargs.memcache
|
||||||
|
or self.app.pargs.redis):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.php = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
if WOAptGet.is_installed(self, 'nginx-custom') or WOAptGet.is_installed(self,'nginx-mainline'):
|
||||||
|
services = services + ['nginx']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
if (WOVariables.wo_platform_distro == 'debian' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
if WOAptGet.is_installed(self, 'php5-fpm'):
|
||||||
|
services = services + ['php5-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5-FPM is not installed")
|
||||||
|
else:
|
||||||
|
if WOAptGet.is_installed(self, 'php5.6-fpm'):
|
||||||
|
services = services + ['php5.6-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5.6-FPM is not installed")
|
||||||
|
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php7:
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic'):
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
else:
|
||||||
|
Log.info(self, "Your platform does not support PHP 7")
|
||||||
|
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
if ((WOVariables.wo_mysql_host is "localhost") or
|
||||||
|
(WOVariables.wo_mysql_host is "127.0.0.1")):
|
||||||
|
if (WOAptGet.is_installed(self, 'mysql-server') or
|
||||||
|
WOAptGet.is_installed(self, 'percona-server-server-5.6') or
|
||||||
|
WOAptGet.is_installed(self, 'mariadb-server')):
|
||||||
|
services = services + ['mysql']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL is not installed")
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, "
|
||||||
|
"Unable to check MySQL service status")
|
||||||
|
|
||||||
|
if self.app.pargs.hhvm:
|
||||||
|
if WOAptGet.is_installed(self, 'hhvm'):
|
||||||
|
services = services + ['hhvm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "HHVM is not installed")
|
||||||
|
if self.app.pargs.memcache:
|
||||||
|
if WOAptGet.is_installed(self, 'memcached'):
|
||||||
|
services = services + ['memcached']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Memcache is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.redis:
|
||||||
|
if WOAptGet.is_installed(self, 'redis-server'):
|
||||||
|
services = services + ['redis-server']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Redis server is not installed")
|
||||||
|
|
||||||
|
for service in services:
|
||||||
|
Log.debug(self, "Stopping service: {0}".format(service))
|
||||||
|
WOService.stop_service(self, service)
|
||||||
|
|
||||||
|
@expose(help="Restart stack services")
|
||||||
|
def restart(self):
|
||||||
|
"""Restart services"""
|
||||||
|
services = []
|
||||||
|
if not (self.app.pargs.nginx or self.app.pargs.php or self.app.pargs.php7
|
||||||
|
or self.app.pargs.mysql or self.app.pargs.hhvm or self.app.pargs.memcache
|
||||||
|
or self.app.pargs.redis):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.php = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
if WOAptGet.is_installed(self, 'nginx-custom') or WOAptGet.is_installed(self,'nginx-mainline'):
|
||||||
|
services = services + ['nginx']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
if (WOVariables.wo_platform_distro == 'debian' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
if WOAptGet.is_installed(self, 'php5-fpm'):
|
||||||
|
services = services + ['php5-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5-FPM is not installed")
|
||||||
|
else:
|
||||||
|
if WOAptGet.is_installed(self, 'php5.6-fpm'):
|
||||||
|
services = services + ['php5.6-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5.6-FPM is not installed")
|
||||||
|
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php7:
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic'):
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
else:
|
||||||
|
Log.info(self, "Your platform does not support PHP 7")
|
||||||
|
|
||||||
|
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
if ((WOVariables.wo_mysql_host is "localhost") or
|
||||||
|
(WOVariables.wo_mysql_host is "127.0.0.1")):
|
||||||
|
if (WOAptGet.is_installed(self, 'mysql-server') or
|
||||||
|
WOAptGet.is_installed(self, 'percona-server-server-5.6') or
|
||||||
|
WOAptGet.is_installed(self, 'mariadb-server')):
|
||||||
|
services = services + ['mysql']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL is not installed")
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, "
|
||||||
|
"Unable to check MySQL service status")
|
||||||
|
|
||||||
|
if self.app.pargs.hhvm:
|
||||||
|
if WOAptGet.is_installed(self, 'hhvm'):
|
||||||
|
services = services + ['hhvm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "HHVM is not installed")
|
||||||
|
if self.app.pargs.memcache:
|
||||||
|
if WOAptGet.is_installed(self, 'memcached'):
|
||||||
|
services = services + ['memcached']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Memcache is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.redis:
|
||||||
|
if WOAptGet.is_installed(self, 'redis-server'):
|
||||||
|
services = services + ['redis-server']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Redis server is not installed")
|
||||||
|
|
||||||
|
for service in services:
|
||||||
|
Log.debug(self, "Restarting service: {0}".format(service))
|
||||||
|
WOService.restart_service(self, service)
|
||||||
|
|
||||||
|
@expose(help="Get stack status")
|
||||||
|
def status(self):
|
||||||
|
"""Status of services"""
|
||||||
|
services = []
|
||||||
|
if not (self.app.pargs.nginx or self.app.pargs.php or self.app.pargs.php7
|
||||||
|
or self.app.pargs.mysql or self.app.pargs.hhvm or self.app.pargs.memcache
|
||||||
|
or self.app.pargs.redis):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.php = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
self.app.pargs.hhvm = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
if WOAptGet.is_installed(self, 'nginx-custom') or WOAptGet.is_installed(self,'nginx-mainline'):
|
||||||
|
services = services + ['nginx']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
if (WOVariables.wo_platform_distro == 'debian' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
if WOAptGet.is_installed(self, 'php5-fpm'):
|
||||||
|
services = services + ['php5-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5-FPM is not installed")
|
||||||
|
else:
|
||||||
|
if WOAptGet.is_installed(self, 'php5.6-fpm'):
|
||||||
|
services = services + ['php5.6-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5.6-FPM is not installed")
|
||||||
|
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php7:
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic'):
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
else:
|
||||||
|
Log.info(self, "Your platform does not support PHP 7")
|
||||||
|
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
if ((WOVariables.wo_mysql_host is "localhost") or
|
||||||
|
(WOVariables.wo_mysql_host is "127.0.0.1")):
|
||||||
|
if (WOAptGet.is_installed(self, 'mysql-server') or
|
||||||
|
WOAptGet.is_installed(self, 'percona-server-server-5.6') or
|
||||||
|
WOAptGet.is_installed(self, 'mariadb-server')):
|
||||||
|
services = services + ['mysql']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL is not installed")
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, "
|
||||||
|
"Unable to check MySQL service status")
|
||||||
|
|
||||||
|
if self.app.pargs.hhvm:
|
||||||
|
if WOAptGet.is_installed(self, 'hhvm'):
|
||||||
|
services = services + ['hhvm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "HHVM is not installed")
|
||||||
|
if self.app.pargs.memcache:
|
||||||
|
if WOAptGet.is_installed(self, 'memcached'):
|
||||||
|
services = services + ['memcached']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Memcache is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.redis:
|
||||||
|
if WOAptGet.is_installed(self, 'redis-server'):
|
||||||
|
services = services + ['redis-server']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Redis server is not installed")
|
||||||
|
|
||||||
|
for service in services:
|
||||||
|
if WOService.get_service_status(self, service):
|
||||||
|
Log.info(self, "{0:10}: {1}".format(service, "Running"))
|
||||||
|
|
||||||
|
@expose(help="Reload stack services")
|
||||||
|
def reload(self):
|
||||||
|
"""Reload service"""
|
||||||
|
services = []
|
||||||
|
if not (self.app.pargs.nginx or self.app.pargs.php or self.app.pargs.php7
|
||||||
|
or self.app.pargs.mysql or self.app.pargs.hhvm or self.app.pargs.memcache
|
||||||
|
or self.app.pargs.redis):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
self.app.pargs.php = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx:
|
||||||
|
if WOAptGet.is_installed(self, 'nginx-custom') or WOAptGet.is_installed(self,'nginx-mainline'):
|
||||||
|
services = services + ['nginx']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
if (WOVariables.wo_platform_distro == 'debian' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
if WOAptGet.is_installed(self, 'php5-fpm'):
|
||||||
|
services = services + ['php5-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5-FPM is not installed")
|
||||||
|
else:
|
||||||
|
if WOAptGet.is_installed(self, 'php5.6-fpm'):
|
||||||
|
services = services + ['php5.6-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP5.6-FPM is not installed")
|
||||||
|
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php7:
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic'):
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
services = services + ['php7.0-fpm']
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP7.0-FPM is not installed")
|
||||||
|
else:
|
||||||
|
Log.info(self, "Your platform does not support PHP 7")
|
||||||
|
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
if ((WOVariables.wo_mysql_host is "localhost") or
|
||||||
|
(WOVariables.wo_mysql_host is "127.0.0.1")):
|
||||||
|
if (WOAptGet.is_installed(self, 'mysql-server') or
|
||||||
|
WOAptGet.is_installed(self, 'percona-server-server-5.6') or
|
||||||
|
WOAptGet.is_installed(self, 'mariadb-server')):
|
||||||
|
services = services + ['mysql']
|
||||||
|
else:
|
||||||
|
Log.info(self, "MySQL is not installed")
|
||||||
|
else:
|
||||||
|
Log.warn(self, "Remote MySQL found, "
|
||||||
|
"Unable to check MySQL service status")
|
||||||
|
|
||||||
|
if self.app.pargs.hhvm:
|
||||||
|
Log.info(self, "HHVM does not support to reload")
|
||||||
|
|
||||||
|
if self.app.pargs.memcache:
|
||||||
|
if WOAptGet.is_installed(self, 'memcached'):
|
||||||
|
services = services + ['memcached']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Memcache is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.redis:
|
||||||
|
if WOAptGet.is_installed(self, 'redis-server'):
|
||||||
|
services = services + ['redis-server']
|
||||||
|
else:
|
||||||
|
Log.info(self, "Redis server is not installed")
|
||||||
|
|
||||||
|
for service in services:
|
||||||
|
Log.debug(self, "Reloading service: {0}".format(service))
|
||||||
|
WOService.reload_service(self, service)
|
||||||
233
wo/cli/plugins/stack_upgrade.py
Normal file
233
wo/cli/plugins/stack_upgrade.py
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from cement.core import handler, hook
|
||||||
|
from wo.core.logging import Log
|
||||||
|
from wo.core.variables import WOVariables
|
||||||
|
from wo.core.aptget import WOAptGet
|
||||||
|
from wo.core.apt_repo import WORepo
|
||||||
|
from wo.core.services import WOService
|
||||||
|
from wo.core.fileutils import WOFileUtils
|
||||||
|
from wo.core.shellexec import WOShellExec
|
||||||
|
from wo.core.git import WOGit
|
||||||
|
from wo.core.download import WODownload
|
||||||
|
import configparser
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class WOStackUpgradeController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'upgrade'
|
||||||
|
stacked_on = 'stack'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
description = ('Upgrade stack safely')
|
||||||
|
arguments = [
|
||||||
|
(['--all'],
|
||||||
|
dict(help='Upgrade all stack', action='store_true')),
|
||||||
|
(['--web'],
|
||||||
|
dict(help='Upgrade web stack', action='store_true')),
|
||||||
|
(['--admin'],
|
||||||
|
dict(help='Upgrade admin tools stack', action='store_true')),
|
||||||
|
(['--nginx'],
|
||||||
|
dict(help='Upgrade Nginx stack', action='store_true')),
|
||||||
|
(['--nginxmainline'],
|
||||||
|
dict(help='Upgrade Nginx Mainline stack', action='store_true')),
|
||||||
|
(['--php'],
|
||||||
|
dict(help='Upgrade PHP stack', action='store_true')),
|
||||||
|
(['--mysql'],
|
||||||
|
dict(help='Upgrade MySQL stack', action='store_true')),
|
||||||
|
(['--hhvm'],
|
||||||
|
dict(help='Upgrade HHVM stack', action='store_true')),
|
||||||
|
(['--wpcli'],
|
||||||
|
dict(help='Upgrade WPCLI', action='store_true')),
|
||||||
|
(['--redis'],
|
||||||
|
dict(help='Upgrade Redis', action='store_true')),
|
||||||
|
(['--php56'],
|
||||||
|
dict(help="Upgrade to PHP5.6 from PHP5.5",
|
||||||
|
action='store_true')),
|
||||||
|
(['--no-prompt'],
|
||||||
|
dict(help="Upgrade Packages without any prompt",
|
||||||
|
action='store_true')),
|
||||||
|
]
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def upgrade_php56(self):
|
||||||
|
if WOVariables.wo_platform_distro == "ubuntu":
|
||||||
|
if os.path.isfile("/etc/apt/sources.list.d/ondrej-php5-5_6-{0}."
|
||||||
|
"list".format(WOVariables.wo_platform_codename)):
|
||||||
|
Log.error(self, "Unable to find PHP 5.5")
|
||||||
|
else:
|
||||||
|
if not(os.path.isfile(WOVariables.wo_repo_file_path) and
|
||||||
|
WOFileUtils.grep(self, WOVariables.wo_repo_file_path,
|
||||||
|
"php55")):
|
||||||
|
Log.error(self, "Unable to find PHP 5.5")
|
||||||
|
|
||||||
|
Log.info(self, "During PHP update process non nginx-cached"
|
||||||
|
" parts of your site may remain down.")
|
||||||
|
|
||||||
|
# Check prompt
|
||||||
|
if (not self.app.pargs.no_prompt):
|
||||||
|
start_upgrade = input("Do you want to continue:[y/N]")
|
||||||
|
if start_upgrade != "Y" and start_upgrade != "y":
|
||||||
|
Log.error(self, "Not starting PHP package update")
|
||||||
|
|
||||||
|
if WOVariables.wo_platform_distro == "ubuntu":
|
||||||
|
WORepo.remove(self, ppa="ppa:ondrej/php5")
|
||||||
|
WORepo.add(self, ppa=WOVariables.wo_php_repo)
|
||||||
|
else:
|
||||||
|
WOAptGet.remove(self, ["php5-xdebug"])
|
||||||
|
WOFileUtils.searchreplace(self, WOVariables.wo_repo_file_path,
|
||||||
|
"php55", "php56")
|
||||||
|
|
||||||
|
Log.info(self, "Updating apt-cache, please wait...")
|
||||||
|
WOAptGet.update(self)
|
||||||
|
Log.info(self, "Installing packages, please wait ...")
|
||||||
|
if (WOVariables.wo_platform_codename == 'trusty' or WOVariables.wo_platform_codename == 'xenial' or WOVariables.wo_platform_codename == 'bionic'):
|
||||||
|
WOAptGet.install(self, WOVariables.wo_php5_6 + WOVariables.wo_php_extra)
|
||||||
|
else:
|
||||||
|
WOAptGet.install(self, WOVariables.wo_php)
|
||||||
|
|
||||||
|
if WOVariables.wo_platform_distro == "debian":
|
||||||
|
WOShellExec.cmd_exec(self, "pecl install xdebug")
|
||||||
|
|
||||||
|
with open("/etc/php5/mods-available/xdebug.ini",
|
||||||
|
encoding='utf-8', mode='a') as myfile:
|
||||||
|
myfile.write(";zend_extension=/usr/lib/php5/20131226/"
|
||||||
|
"xdebug.so\n")
|
||||||
|
|
||||||
|
WOFileUtils.create_symlink(self, ["/etc/php5/mods-available/"
|
||||||
|
"xdebug.ini", "/etc/php5/fpm/conf.d"
|
||||||
|
"/20-xedbug.ini"])
|
||||||
|
|
||||||
|
Log.info(self, "Successfully upgraded from PHP 5.5 to PHP 5.6")
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
# All package update
|
||||||
|
if ((not self.app.pargs.php56)):
|
||||||
|
|
||||||
|
apt_packages = []
|
||||||
|
packages = []
|
||||||
|
|
||||||
|
if ((not self.app.pargs.web) and (not self.app.pargs.nginx) and
|
||||||
|
(not self.app.pargs.php) and (not self.app.pargs.mysql) and
|
||||||
|
(not self.app.pargs.hhvm) and (not self.app.pargs.all) and
|
||||||
|
(not self.app.pargs.wpcli) and (not self.app.pargs.redis) and
|
||||||
|
(not self.app.pargs.nginxmainline)):
|
||||||
|
self.app.pargs.web = True
|
||||||
|
|
||||||
|
if self.app.pargs.all:
|
||||||
|
self.app.pargs.web = True
|
||||||
|
|
||||||
|
if self.app.pargs.web:
|
||||||
|
if WOAptGet.is_installed(self, 'nginx-custom'):
|
||||||
|
self.app.pargs.nginx = True
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx is not already installed")
|
||||||
|
self.app.pargs.php = True
|
||||||
|
self.app.pargs.mysql = True
|
||||||
|
self.app.pargs.wpcli = True
|
||||||
|
|
||||||
|
if self.app.pargs.nginx :
|
||||||
|
if WOAptGet.is_installed(self, 'nginx-custom'):
|
||||||
|
apt_packages = apt_packages + WOVariables.wo_nginx
|
||||||
|
else:
|
||||||
|
Log.info(self, "Nginx Stable is not already installed")
|
||||||
|
|
||||||
|
if self.app.pargs.php:
|
||||||
|
if (WOVariables.wo_platform_distro == 'debian' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
if WOAptGet.is_installed(self, 'php5-fpm'):
|
||||||
|
apt_packages = apt_packages + WOVariables.wo_php
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP is not installed")
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
apt_packages = apt_packages + WOVariables.wo_php7_0
|
||||||
|
else:
|
||||||
|
if WOAptGet.is_installed(self, 'php5.6-fpm'):
|
||||||
|
apt_packages = apt_packages + WOVariables.wo_php5_6 + WOVariables.wo_php_extra
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP 5.6 is not installed")
|
||||||
|
if WOAptGet.is_installed(self, 'php7.0-fpm'):
|
||||||
|
apt_packages = apt_packages + WOVariables.wo_php7_0 + WOVariables.wo_php_extra
|
||||||
|
else:
|
||||||
|
Log.info(self, "PHP 7.0 is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.hhvm:
|
||||||
|
if WOAptGet.is_installed(self, 'hhvm'):
|
||||||
|
apt_packages = apt_packages + WOVariables.wo_hhvm
|
||||||
|
else:
|
||||||
|
Log.info(self, "HHVM is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.mysql:
|
||||||
|
if WOAptGet.is_installed(self, 'mariadb-server'):
|
||||||
|
apt_packages = apt_packages + WOVariables.wo_mysql
|
||||||
|
else:
|
||||||
|
Log.info(self, "MariaDB is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.redis:
|
||||||
|
if WOAptGet.is_installed(self, 'redis-server'):
|
||||||
|
apt_packages = apt_packages + WOVariables.wo_redis
|
||||||
|
else:
|
||||||
|
Log.info(self, "Redis is not installed")
|
||||||
|
|
||||||
|
if self.app.pargs.wpcli:
|
||||||
|
if os.path.isfile('/usr/bin/wp'):
|
||||||
|
packages = packages + [["https://github.com/wp-cli/wp-cli/"
|
||||||
|
"releases/download/v{0}/"
|
||||||
|
"wp-cli-{0}.phar"
|
||||||
|
"".format(WOVariables.wo_wp_cli),
|
||||||
|
"/usr/bin/wp",
|
||||||
|
"WP-CLI"]]
|
||||||
|
else:
|
||||||
|
Log.info(self, "WPCLI is not installed with WordOps")
|
||||||
|
|
||||||
|
if len(packages) or len(apt_packages):
|
||||||
|
|
||||||
|
Log.info(self, "During package update process non nginx-cached"
|
||||||
|
" parts of your site may remain down")
|
||||||
|
# Check prompt
|
||||||
|
if (not self.app.pargs.no_prompt):
|
||||||
|
start_upgrade = input("Do you want to continue:[y/N]")
|
||||||
|
if start_upgrade != "Y" and start_upgrade != "y":
|
||||||
|
Log.error(self, "Not starting package update")
|
||||||
|
|
||||||
|
Log.info(self, "Updating packages, please wait...")
|
||||||
|
if len(apt_packages):
|
||||||
|
# apt-get update
|
||||||
|
WOAptGet.update(self)
|
||||||
|
# Update packages
|
||||||
|
WOAptGet.install(self, apt_packages)
|
||||||
|
|
||||||
|
# Post Actions after package updates
|
||||||
|
if (set(WOVariables.wo_nginx).issubset(set(apt_packages))):
|
||||||
|
WOService.restart_service(self, 'nginx')
|
||||||
|
if (WOVariables.wo_platform_distro == 'debian' or WOVariables.wo_platform_codename == 'precise'):
|
||||||
|
if set(WOVariables.wo_php).issubset(set(apt_packages)):
|
||||||
|
WOService.restart_service(self, 'php5-fpm')
|
||||||
|
else:
|
||||||
|
if set(WOVariables.wo_php5_6).issubset(set(apt_packages)):
|
||||||
|
WOService.restart_service(self, 'php5.6-fpm')
|
||||||
|
if set(WOVariables.wo_php7_0).issubset(set(apt_packages)):
|
||||||
|
WOService.restart_service(self, 'php7.0-fpm')
|
||||||
|
if set(WOVariables.wo_hhvm).issubset(set(apt_packages)):
|
||||||
|
WOService.restart_service(self, 'hhvm')
|
||||||
|
if set(WOVariables.wo_mysql).issubset(set(apt_packages)):
|
||||||
|
WOService.restart_service(self, 'mysql')
|
||||||
|
if set(WOVariables.wo_redis).issubset(set(apt_packages)):
|
||||||
|
WOService.restart_service(self, 'redis-server')
|
||||||
|
|
||||||
|
if len(packages):
|
||||||
|
if self.app.pargs.wpcli:
|
||||||
|
WOFileUtils.remove(self,['/usr/bin/wp'])
|
||||||
|
|
||||||
|
Log.debug(self, "Downloading following: {0}".format(packages))
|
||||||
|
WODownload.download(self, packages)
|
||||||
|
|
||||||
|
if self.app.pargs.wpcli:
|
||||||
|
WOFileUtils.chmod(self, "/usr/bin/wp", 0o775)
|
||||||
|
|
||||||
|
Log.info(self, "Successfully updated packages")
|
||||||
|
|
||||||
|
# PHP 5.6 to 5.6
|
||||||
|
elif (self.app.pargs.php56):
|
||||||
|
self.upgrade_php56()
|
||||||
|
else:
|
||||||
|
self.app.args.print_help()
|
||||||
94
wo/cli/plugins/sync.py
Normal file
94
wo/cli/plugins/sync.py
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from cement.core import handler, hook
|
||||||
|
from wo.core.fileutils import WOFileUtils
|
||||||
|
from wo.cli.plugins.sitedb import *
|
||||||
|
from wo.core.mysql import *
|
||||||
|
from wo.core.logging import Log
|
||||||
|
|
||||||
|
|
||||||
|
def wo_sync_hook(app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WOSyncController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'sync'
|
||||||
|
stacked_on = 'base'
|
||||||
|
stacked_type = 'nested'
|
||||||
|
description = 'synchronize the WordOps database'
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
self.sync()
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def sync(self):
|
||||||
|
"""
|
||||||
|
1. reads database information from wp/wo-config.php
|
||||||
|
2. updates records into wo database accordingly.
|
||||||
|
"""
|
||||||
|
Log.info(self, "Synchronizing wo database, please wait...")
|
||||||
|
sites = getAllsites(self)
|
||||||
|
if not sites:
|
||||||
|
pass
|
||||||
|
for site in sites:
|
||||||
|
if site.site_type in ['mysql', 'wp', 'wpsubdir', 'wpsubdomain']:
|
||||||
|
wo_site_webroot = site.site_path
|
||||||
|
# Read config files
|
||||||
|
configfiles = glob.glob(wo_site_webroot + '/*-config.php')
|
||||||
|
|
||||||
|
#search for wp-config.php inside htdocs/
|
||||||
|
if not configfiles:
|
||||||
|
Log.debug(self, "Config files not found in {0}/ "
|
||||||
|
.format(wo_site_webroot))
|
||||||
|
if site.site_type != 'mysql':
|
||||||
|
Log.debug(self, "Searching wp-config.php in {0}/htdocs/ "
|
||||||
|
.format(wo_site_webroot))
|
||||||
|
configfiles = glob.glob(wo_site_webroot + '/htdocs/wp-config.php')
|
||||||
|
|
||||||
|
if configfiles:
|
||||||
|
if WOFileUtils.isexist(self, configfiles[0]):
|
||||||
|
wo_db_name = (WOFileUtils.grep(self, configfiles[0],
|
||||||
|
'DB_NAME').split(',')[1]
|
||||||
|
.split(')')[0].strip().replace('\'', ''))
|
||||||
|
wo_db_user = (WOFileUtils.grep(self, configfiles[0],
|
||||||
|
'DB_USER').split(',')[1]
|
||||||
|
.split(')')[0].strip().replace('\'', ''))
|
||||||
|
wo_db_pass = (WOFileUtils.grep(self, configfiles[0],
|
||||||
|
'DB_PASSWORD').split(',')[1]
|
||||||
|
.split(')')[0].strip().replace('\'', ''))
|
||||||
|
wo_db_host = (WOFileUtils.grep(self, configfiles[0],
|
||||||
|
'DB_HOST').split(',')[1]
|
||||||
|
.split(')')[0].strip().replace('\'', ''))
|
||||||
|
|
||||||
|
# Check if database really exist
|
||||||
|
try:
|
||||||
|
if not WOMysql.check_db_exists(self, wo_db_name):
|
||||||
|
# Mark it as deleted if not exist
|
||||||
|
wo_db_name = 'deleted'
|
||||||
|
wo_db_user = 'deleted'
|
||||||
|
wo_db_pass = 'deleted'
|
||||||
|
except StatementExcecutionError as e:
|
||||||
|
Log.debug(self, str(e))
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, str(e))
|
||||||
|
|
||||||
|
if site.db_name != wo_db_name:
|
||||||
|
# update records if any mismatch found
|
||||||
|
Log.debug(self, "Updating wo db record for {0}"
|
||||||
|
.format(site.sitename))
|
||||||
|
updateSiteInfo(self, site.sitename,
|
||||||
|
db_name=wo_db_name,
|
||||||
|
db_user=wo_db_user,
|
||||||
|
db_password=wo_db_pass,
|
||||||
|
db_host=wo_db_host)
|
||||||
|
else:
|
||||||
|
Log.debug(self, "Config files not found for {0} "
|
||||||
|
.format(site.sitename))
|
||||||
|
|
||||||
|
|
||||||
|
def load(app):
|
||||||
|
# register the plugin class.. this only happens if the plugin is enabled
|
||||||
|
handler.register(WOSyncController)
|
||||||
|
# register a hook (function) to run after arguments are parsed.
|
||||||
|
hook.register('post_argument_parsing', wo_sync_hook)
|
||||||
44
wo/cli/plugins/update.py
Normal file
44
wo/cli/plugins/update.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
from cement.core.controller import CementBaseController, expose
|
||||||
|
from cement.core import handler, hook
|
||||||
|
from wo.core.download import WODownload
|
||||||
|
from wo.core.logging import Log
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def wo_update_hook(app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WOUpdateController(CementBaseController):
|
||||||
|
class Meta:
|
||||||
|
label = 'wo_update'
|
||||||
|
stacked_on = 'base'
|
||||||
|
aliases = ['update']
|
||||||
|
aliases_only = True
|
||||||
|
stacked_type = 'nested'
|
||||||
|
description = ('update WordOps to latest version')
|
||||||
|
usage = "wo update"
|
||||||
|
|
||||||
|
@expose(hide=True)
|
||||||
|
def default(self):
|
||||||
|
filename = "woupdate" + time.strftime("%Y%m%d-%H%M%S")
|
||||||
|
WODownload.download(self, [["https://wrdps.nl/woup",
|
||||||
|
"/tmp/{0}".format(filename),
|
||||||
|
"update script"]])
|
||||||
|
try:
|
||||||
|
Log.info(self, "updating WordOps, please wait...")
|
||||||
|
os.system("bash /tmp/{0}".format(filename))
|
||||||
|
except OSError as e:
|
||||||
|
Log.debug(self, str(e))
|
||||||
|
Log.error(self, "WordOps update failed !")
|
||||||
|
except Exception as e:
|
||||||
|
Log.debug(self, str(e))
|
||||||
|
Log.error(self, "WordOps update failed !")
|
||||||
|
|
||||||
|
|
||||||
|
def load(app):
|
||||||
|
# register the plugin class.. this only happens if the plugin is enabled
|
||||||
|
handler.register(WOUpdateController)
|
||||||
|
# register a hook (function) to run after arguments are parsed.
|
||||||
|
hook.register('post_argument_parsing', wo_update_hook)
|
||||||
27
wo/cli/templates/15-content_filter_mode.mustache
Normal file
27
wo/cli/templates/15-content_filter_mode.mustache
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
use strict;
|
||||||
|
|
||||||
|
# You can modify this file to re-enable SPAM checking through spamassassin
|
||||||
|
# and to re-enable antivirus checking.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Default antivirus checking mode
|
||||||
|
# Please note, that anti-virus checking is DISABLED by
|
||||||
|
# default.
|
||||||
|
# If You wish to enable it, please uncomment the following lines:
|
||||||
|
|
||||||
|
|
||||||
|
@bypass_virus_checks_maps = (
|
||||||
|
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Default SPAM checking mode
|
||||||
|
# Please note, that anti-spam checking is DISABLED by
|
||||||
|
# default.
|
||||||
|
# If You wish to enable it, please uncomment the following lines:
|
||||||
|
|
||||||
|
|
||||||
|
@bypass_spam_checks_maps = (
|
||||||
|
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
|
||||||
|
|
||||||
|
1; # ensure a defined return
|
||||||
44
wo/cli/templates/22222.mustache
Normal file
44
wo/cli/templates/22222.mustache
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# WordOps admin NGINX CONFIGURATION
|
||||||
|
|
||||||
|
server {
|
||||||
|
|
||||||
|
listen 22222 default_server ssl http2;
|
||||||
|
|
||||||
|
access_log /var/log/nginx/22222.access.log rt_cache;
|
||||||
|
error_log /var/log/nginx/22222.error.log;
|
||||||
|
|
||||||
|
ssl_certificate {{webroot}}22222/cert/22222.crt;
|
||||||
|
ssl_certificate_key {{webroot}}22222/cert/22222.key;
|
||||||
|
|
||||||
|
# Force HTTP to HTTPS
|
||||||
|
error_page 497 =200 https://$host:22222$request_uri;
|
||||||
|
|
||||||
|
root {{webroot}}22222/htdocs;
|
||||||
|
index index.php index.htm index.html;
|
||||||
|
|
||||||
|
# Turn on directory listing
|
||||||
|
autoindex on;
|
||||||
|
|
||||||
|
# HTTP Authentication on port 22222
|
||||||
|
include common/acl.conf;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display menu at location /fpm/status/
|
||||||
|
location = /fpm/status/ {}
|
||||||
|
|
||||||
|
location ~ /fpm/status/(.*) {
|
||||||
|
try_files $uri =404;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_NAME /status;
|
||||||
|
fastcgi_pass $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php;
|
||||||
|
}
|
||||||
|
}
|
||||||
0
wo/cli/templates/__init__.py
Normal file
0
wo/cli/templates/__init__.py
Normal file
8
wo/cli/templates/acl.mustache
Normal file
8
wo/cli/templates/acl.mustache
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# WordOps (wo) protect locations using
|
||||||
|
# HTTP authentication || IP address
|
||||||
|
satisfy any;
|
||||||
|
auth_basic "Restricted Area";
|
||||||
|
auth_basic_user_file htpasswd-wo;
|
||||||
|
# Allowed IP Address List
|
||||||
|
allow 127.0.0.1;
|
||||||
|
deny all;
|
||||||
255
wo/cli/templates/anemometer.mustache
Normal file
255
wo/cli/templates/anemometer.mustache
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
<?php
|
||||||
|
$conf['datasources']['localhost'] = array(
|
||||||
|
'host' => '{{host}}',
|
||||||
|
'port' => '{{port}}',
|
||||||
|
'db' => 'slow_query_log',
|
||||||
|
'user' => '{{user}}',
|
||||||
|
'password' => '{{password}}',
|
||||||
|
'tables' => array(
|
||||||
|
'global_query_review' => 'fact',
|
||||||
|
'global_query_review_history' => 'dimension'
|
||||||
|
),
|
||||||
|
'source_type' => 'slow_query_log'
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['default_report_action'] = 'report';
|
||||||
|
|
||||||
|
$conf['reviewers'] = array( 'dba1','dba2');
|
||||||
|
$conf['review_types'] = array( 'good', 'bad', 'ticket-created', 'needs-fix', 'fixed', 'needs-analysis', 'review-again');
|
||||||
|
|
||||||
|
$conf['history_defaults'] = array(
|
||||||
|
'output' => 'table',
|
||||||
|
'fact-group' => 'date',
|
||||||
|
'fact-order' => 'date DESC',
|
||||||
|
'fact-limit' => '90',
|
||||||
|
'dimension-ts_min_start' => date("Y-m-d H:i:s", strtotime( '-90 day')),
|
||||||
|
'dimension-ts_min_end' => date("Y-m-d H:i:s"),
|
||||||
|
'table_fields' => array('date', 'index_ratio','query_time_avg','rows_sent_avg','ts_cnt','Query_time_sum','Lock_time_sum','Rows_sent_sum','Rows_examined_sum','Tmp_table_sum','Filesort_sum','Full_scan_sum')
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['report_defaults'] = array(
|
||||||
|
'fact-group' => 'checksum',
|
||||||
|
'fact-order' => 'Query_time_sum DESC',
|
||||||
|
'fact-limit' => '20',
|
||||||
|
'dimension-ts_min_start' => date("Y-m-d H:i:s", strtotime( '-1 day')),
|
||||||
|
'dimension-ts_min_end' => date("Y-m-d H:i:s"),
|
||||||
|
'table_fields' => array('checksum','snippet', 'index_ratio','query_time_avg','rows_sent_avg','ts_cnt','Query_time_sum','Lock_time_sum','Rows_sent_sum','Rows_examined_sum','Tmp_table_sum','Filesort_sum','Full_scan_sum'),
|
||||||
|
'dimension-pivot-hostname_max' => null
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['graph_defaults'] = array(
|
||||||
|
'fact-group' => 'minute_ts',
|
||||||
|
'fact-order' => 'minute_ts',
|
||||||
|
'fact-limit' => '',
|
||||||
|
'dimension-ts_min_start' => date("Y-m-d H:i:s", strtotime( '-7 day')),
|
||||||
|
'dimension-ts_min_end' => date("Y-m-d H:i:s"),
|
||||||
|
'table_fields' => array('minute_ts'),
|
||||||
|
'plot_field' => 'Query_time_sum',
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['report_defaults']['performance_schema'] = array(
|
||||||
|
'fact-order' => 'SUM_TIMER_WAIT DESC',
|
||||||
|
'fact-limit' => '20',
|
||||||
|
'fact-group' => 'DIGEST',
|
||||||
|
'table_fields' => array( 'DIGEST', 'snippet', 'index_ratio', 'COUNT_STAR', 'SUM_TIMER_WAIT', 'SUM_LOCK_TIME','SUM_ROWS_AFFECTED','SUM_ROWS_SENT','SUM_ROWS_EXAMINED','SUM_CREATED_TMP_TABLES','SUM_SORT_SCAN','SUM_NO_INDEX_USED' )
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['history_defaults']['performance_schema'] = array(
|
||||||
|
'fact-order' => 'SUM_TIMER_WAIT DESC',
|
||||||
|
'fact-limit' => '20',
|
||||||
|
'fact-group' => 'DIGEST',
|
||||||
|
'table_fields' => array( 'DIGEST', 'index_ratio', 'COUNT_STAR', 'SUM_LOCK_TIME','SUM_ROWS_AFFECTED','SUM_ROWS_SENT','SUM_ROWS_EXAMINED','SUM_CREATED_TMP_TABLES','SUM_SORT_SCAN','SUM_NO_INDEX_USED' )
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['report_defaults']['performance_schema_history'] = array(
|
||||||
|
'fact-group' => 'DIGEST',
|
||||||
|
'fact-order' => 'SUM_TIMER_WAIT DESC',
|
||||||
|
'fact-limit' => '20',
|
||||||
|
'dimension-FIRST_SEEN_start' => date("Y-m-d H:i:s", strtotime( '-1 day')),
|
||||||
|
'dimension-FIRST_SEEN_end' => date("Y-m-d H:i:s"),
|
||||||
|
'table_fields' => array( 'DIGEST', 'snippet', 'index_ratio', 'COUNT_STAR', 'SUM_LOCK_TIME','SUM_ROWS_AFFECTED','SUM_ROWS_SENT','SUM_ROWS_EXAMINED','SUM_CREATED_TMP_TABLES','SUM_SORT_SCAN','SUM_NO_INDEX_USED' )
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['graph_defaults']['performance_schema_history'] = array(
|
||||||
|
'fact-group' => 'minute_ts',
|
||||||
|
'fact-order' => 'minute_ts',
|
||||||
|
'fact-limit' => '',
|
||||||
|
'dimension-FIRST_SEEN_start' => date("Y-m-d H:i:s", strtotime( '-7 day')),
|
||||||
|
'dimension-FIRST_SEEN_end' => date("Y-m-d H:i:s"),
|
||||||
|
'table_fields' => array('minute_ts'),
|
||||||
|
'plot_field' => 'SUM_TIMER_WAIT',
|
||||||
|
'dimension-pivot-hostname_max' => null
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['history_defaults']['performance_schema_history'] = array(
|
||||||
|
'output' => 'table',
|
||||||
|
'fact-group' => 'date',
|
||||||
|
'fact-order' => 'date DESC',
|
||||||
|
'fact-limit' => '90',
|
||||||
|
'dimension-FIRST_SEEN_start' => date("Y-m-d H:i:s", strtotime( '-90 day')),
|
||||||
|
'dimension-FIRST_SEEN_end' => date("Y-m-d H:i:s"),
|
||||||
|
'table_fields' => array( 'date', 'snippet', 'index_ratio', 'COUNT_STAR', 'SUM_LOCK_TIME','SUM_ROWS_AFFECTED','SUM_ROWS_SENT','SUM_ROWS_EXAMINED','SUM_CREATED_TMP_TABLES','SUM_SORT_SCAN','SUM_NO_INDEX_USED' )
|
||||||
|
);
|
||||||
|
$conf['plugins'] = array(
|
||||||
|
|
||||||
|
'visual_explain' => '/usr/bin/pt-visual-explain',
|
||||||
|
'query_advisor' => '/usr/bin/pt-query-advisor',
|
||||||
|
|
||||||
|
'show_create' => true,
|
||||||
|
'show_status' => true,
|
||||||
|
|
||||||
|
'explain' => function ($sample) {
|
||||||
|
$conn = array();
|
||||||
|
|
||||||
|
if (!array_key_exists('hostname_max',$sample) or strlen($sample['hostname_max']) < 5)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pos = strpos($sample['hostname_max'], ':');
|
||||||
|
if ($pos === false)
|
||||||
|
{
|
||||||
|
$conn['port'] = 3306;
|
||||||
|
$conn['host'] = $sample['hostname_max'];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$parts = preg_split("/:/", $sample['hostname_max']);
|
||||||
|
$conn['host'] = $parts[0];
|
||||||
|
$conn['port'] = $parts[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
$conn['db'] = 'mysql';
|
||||||
|
if ($sample['db_max'] != '')
|
||||||
|
{
|
||||||
|
$conn['db'] = $sample['db_max'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$conn['user'] = '{{user}}';
|
||||||
|
$conn['password'] = '{{password}}';
|
||||||
|
|
||||||
|
return $conn;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['reports']['slow_query_log'] = array(
|
||||||
|
'join' => array (
|
||||||
|
'dimension' => 'USING (`checksum`)'
|
||||||
|
),
|
||||||
|
'fields' => array(
|
||||||
|
'fact' => array(
|
||||||
|
'group' => 'group',
|
||||||
|
'order' => 'order',
|
||||||
|
'having' => 'having',
|
||||||
|
'limit' => 'limit',
|
||||||
|
'first_seen'=> 'clear|reldate|ge|where',
|
||||||
|
'where' => 'raw_where',
|
||||||
|
'sample' => 'clear|like|where',
|
||||||
|
'checksum' => 'clear|where',
|
||||||
|
'reviewed_status' => 'clear|where',
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
'dimension' => array(
|
||||||
|
'extra_fields' => 'where',
|
||||||
|
'hostname_max' => 'clear|where',
|
||||||
|
'ts_min' => 'date_range|reldate|clear|where',
|
||||||
|
'pivot-hostname_max' => 'clear|pivot|select',
|
||||||
|
'pivot-checksum' => 'clear|pivot|select',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'custom_fields' => array(
|
||||||
|
'checksum' => 'checksum',
|
||||||
|
'date' => 'DATE(ts_min)',
|
||||||
|
'hour' => 'substring(ts_min,1,13)',
|
||||||
|
'hour_ts' => 'round(unix_timestamp(substring(ts_min,1,13)))',
|
||||||
|
'minute_ts' => 'round(unix_timestamp(substring(ts_min,1,16)))',
|
||||||
|
'minute' => 'substring(ts_min,1,16)',
|
||||||
|
'snippet' => 'LEFT(dimension.sample,20)',
|
||||||
|
'index_ratio' =>'ROUND(SUM(Rows_examined_sum)/SUM(rows_sent_sum),2)',
|
||||||
|
'query_time_avg' => 'SUM(Query_time_sum) / SUM(ts_cnt)',
|
||||||
|
'rows_sent_avg' => 'ROUND(SUM(Rows_sent_sum)/SUM(ts_cnt),0)',
|
||||||
|
),
|
||||||
|
|
||||||
|
'callbacks' => array(
|
||||||
|
'table' => array(
|
||||||
|
'date' => function ($x) { $type=''; if ( date('N',strtotime($x)) >= 6) { $type = 'weekend'; } return array($x,$type); },
|
||||||
|
'checksum' => function ($x) { return array(dec2hex($x), ''); }
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['reports']['performance_schema'] = array(
|
||||||
|
'fields' => array(
|
||||||
|
'fact' => array(
|
||||||
|
'order' => 'order',
|
||||||
|
'having' => 'having',
|
||||||
|
'limit' => 'limit',
|
||||||
|
'first_seen' => 'date_range|reldate|clear|where',
|
||||||
|
'where' => 'raw_where',
|
||||||
|
'DIGEST' => 'clear|where',
|
||||||
|
'DIGEST_TEXT' => 'clear|like|where',
|
||||||
|
'group' => 'group',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'custom_fields' => array(
|
||||||
|
'snippet' => 'LEFT(fact.DIGEST_TEXT,20)',
|
||||||
|
'index_ratio' =>'ROUND(SUM_ROWS_EXAMINED/SUM_ROWS_SENT,2)',
|
||||||
|
'rows_sent_avg' => 'ROUND(SUM_ROWS_SENT/COUNT_STAR,0)',
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
'special_field_names' => array(
|
||||||
|
'time' => 'FIRST_SEEN',
|
||||||
|
'checksum' => 'DIGEST',
|
||||||
|
'sample' => 'DIGEST_TEXT',
|
||||||
|
'fingerprint' => 'DIGEST_TEXT',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
$conf['reports']['performance_schema_history'] = array(
|
||||||
|
'join' => array (
|
||||||
|
'dimension' => 'USING (`DIGEST`)'
|
||||||
|
),
|
||||||
|
'fields' => array(
|
||||||
|
'fact' => array(
|
||||||
|
'group' => 'group',
|
||||||
|
'order' => 'order',
|
||||||
|
'having' => 'having',
|
||||||
|
'limit' => 'limit',
|
||||||
|
'first_seen'=> 'clear|reldate|ge|where',
|
||||||
|
'where' => 'raw_where',
|
||||||
|
'DIGEST_TEXT' => 'clear|like|where',
|
||||||
|
'DIGEST' => 'clear|where',
|
||||||
|
'reviewed_status' => 'clear|where',
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
'dimension' => array(
|
||||||
|
'extra_fields' => 'where',
|
||||||
|
'hostname' => 'clear|where',
|
||||||
|
'FIRST_SEEN' => 'date_range|reldate|clear|where',
|
||||||
|
'pivot-hostname' => 'clear|pivot|select',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'custom_fields' => array(
|
||||||
|
'date' => 'DATE(fact.FIRST_SEEN)',
|
||||||
|
'snippet' => 'LEFT(fact.DIGEST_TEXT,20)',
|
||||||
|
'index_ratio' =>'ROUND(SUM_ROWS_EXAMINED/SUM_ROWS_SENT,2)',
|
||||||
|
'rows_sent_avg' => 'ROUND(SUM_ROWS_SENT/COUNT_STAR,0)',
|
||||||
|
'hour' => 'substring(dimension.FIRST_SEEN,1,13)',
|
||||||
|
'hour_ts' => 'round(unix_timestamp(substring(dimension.FIRST_SEEN,1,13)))',
|
||||||
|
'minute_ts' => 'round(unix_timestamp(substring(dimension.FIRST_SEEN,1,16)))',
|
||||||
|
'minute' => 'substring(dimension.FIRST_SEEN,1,16)',
|
||||||
|
),
|
||||||
|
|
||||||
|
'special_field_names' => array(
|
||||||
|
'time' => 'FIRST_SEEN',
|
||||||
|
'checksum' => 'DIGEST',
|
||||||
|
'hostname' => 'hostname',
|
||||||
|
'sample' => 'DIGEST_TEXT'
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
?>
|
||||||
2
wo/cli/templates/blockips.mustache
Normal file
2
wo/cli/templates/blockips.mustache
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Block IP Address
|
||||||
|
# deny 1.1.1.1;
|
||||||
10
wo/cli/templates/fastcgi.mustache
Normal file
10
wo/cli/templates/fastcgi.mustache
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# FastCGI cache settings
|
||||||
|
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:50m inactive=60m;
|
||||||
|
fastcgi_cache_key "$scheme$request_method$host$request_uri";
|
||||||
|
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
|
||||||
|
fastcgi_cache_valid 200 301 302 404 1h;
|
||||||
|
fastcgi_buffers 16 16k;
|
||||||
|
fastcgi_buffer_size 32k;
|
||||||
|
fastcgi_param SERVER_NAME $http_host;
|
||||||
|
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
|
||||||
|
fastcgi_keep_conn on;
|
||||||
10
wo/cli/templates/info_mysql.mustache
Normal file
10
wo/cli/templates/info_mysql.mustache
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
MySQL ({{version}}) on {{host}}:
|
||||||
|
|
||||||
|
port {{port}}
|
||||||
|
wait_timeout {{wait_timeout}}
|
||||||
|
interactive_timeout {{interactive_timeout}}
|
||||||
|
max_used_connections {{max_used_connections}}
|
||||||
|
datadir {{datadir}}
|
||||||
|
socket {{socket}}
|
||||||
|
my.cnf [PATH] /etc/mysql/conf.d/my.cnf
|
||||||
10
wo/cli/templates/info_nginx.mustache
Normal file
10
wo/cli/templates/info_nginx.mustache
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
NGINX ({{version}}):
|
||||||
|
|
||||||
|
user {{user}}
|
||||||
|
worker_processes {{worker_processes}}
|
||||||
|
worker_connections {{worker_connections}}
|
||||||
|
keepalive_timeout {{keepalive_timeout}}
|
||||||
|
fastcgi_read_timeout {{fastcgi_read_timeout}}
|
||||||
|
client_max_body_size {{client_max_body_size}}
|
||||||
|
allow {{allow}}
|
||||||
35
wo/cli/templates/info_php.mustache
Normal file
35
wo/cli/templates/info_php.mustache
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
PHP ({{version}}):
|
||||||
|
|
||||||
|
user {{user}}
|
||||||
|
expose_php {{expose_php}}
|
||||||
|
memory_limit {{memory_limit}}
|
||||||
|
post_max_size {{post_max_size}}
|
||||||
|
upload_max_filesize {{upload_max_filesize}}
|
||||||
|
max_execution_time {{max_execution_time}}
|
||||||
|
|
||||||
|
Information about www.conf
|
||||||
|
ping.path {{www_ping_path}}
|
||||||
|
pm.status_path {{www_pm_status_path}}
|
||||||
|
process_manager {{www_pm}}
|
||||||
|
pm.max_requests {{www_pm_max_requests}}
|
||||||
|
pm.max_children {{www_pm_max_children}}
|
||||||
|
pm.start_servers {{www_pm_start_servers}}
|
||||||
|
pm.min_spare_servers {{www_pm_min_spare_servers}}
|
||||||
|
pm.max_spare_servers {{www_pm_max_spare_servers}}
|
||||||
|
request_terminate_timeout {{www_request_terminate_timeout}}
|
||||||
|
xdebug.profiler_enable_trigger {{www_xdebug_profiler_enable_trigger}}
|
||||||
|
listen {{www_listen}}
|
||||||
|
|
||||||
|
Information about debug.conf
|
||||||
|
ping.path {{debug_ping_path}}
|
||||||
|
pm.status_path {{debug_pm_status_path}}
|
||||||
|
process_manager {{debug_pm}}
|
||||||
|
pm.max_requests {{debug_pm_max_requests}}
|
||||||
|
pm.max_children {{debug_pm_max_children}}
|
||||||
|
pm.start_servers {{debug_pm_start_servers}}
|
||||||
|
pm.min_spare_servers {{debug_pm_min_spare_servers}}
|
||||||
|
pm.max_spare_servers {{debug_pm_max_spare_servers}}
|
||||||
|
request_terminate_timeout {{debug_request_terminate_timeout}}
|
||||||
|
xdebug.profiler_enable_trigger {{debug_xdebug_profiler_enable_trigger}}
|
||||||
|
listen {{debug_listen}}
|
||||||
68
wo/cli/templates/locations-php7.mustache
Normal file
68
wo/cli/templates/locations-php7.mustache
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# NGINX CONFIGURATION FOR COMMON LOCATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
# Basic locations files
|
||||||
|
location = /favicon.ico {
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
expires max;
|
||||||
|
}
|
||||||
|
location = /robots.txt {
|
||||||
|
# Some WordPress plugin gererate robots.txt file
|
||||||
|
# Refer #340 issue
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
# Cache static files
|
||||||
|
location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|swf)$ {
|
||||||
|
add_header "Access-Control-Allow-Origin" "*";
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
expires max;
|
||||||
|
}
|
||||||
|
# Security settings for better privacy
|
||||||
|
# Deny hidden files
|
||||||
|
location ~ /\.well-known {
|
||||||
|
allow all;
|
||||||
|
}
|
||||||
|
location ~ /\. {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
# Deny backup extensions & log files
|
||||||
|
location ~* ^.+\.(bak|log|old|orig|original|php#|php~|php_bak|save|swo|swp|sql)$ {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
# Return 403 forbidden for readme.(txt|html) or license.(txt|html) or example.(txt|html)
|
||||||
|
if ($uri ~* "^.+(readme|license|example)\.(txt|html)$") {
|
||||||
|
return 403;
|
||||||
|
}
|
||||||
|
# Status pages
|
||||||
|
location = /nginx_status {
|
||||||
|
stub_status on;
|
||||||
|
access_log off;
|
||||||
|
include common/acl.conf;
|
||||||
|
}
|
||||||
|
location ~ ^/(status|ping)$ {
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php7;
|
||||||
|
include common/acl.conf;
|
||||||
|
}
|
||||||
|
# WordOps (wo) utilities
|
||||||
|
# phpMyAdmin settings
|
||||||
|
location = /pma {
|
||||||
|
return 301 https://$host:22222/db/pma;
|
||||||
|
}
|
||||||
|
location = /phpMyAdmin {
|
||||||
|
return 301 https://$host:22222/db/pma;
|
||||||
|
}
|
||||||
|
location = /phpmyadmin {
|
||||||
|
return 301 https://$host:22222/db/pma;
|
||||||
|
}
|
||||||
|
# Adminer settings
|
||||||
|
location = /adminer {
|
||||||
|
return 301 https://$host:22222/db/adminer;
|
||||||
|
}
|
||||||
68
wo/cli/templates/locations.mustache
Normal file
68
wo/cli/templates/locations.mustache
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# NGINX CONFIGURATION FOR COMMON LOCATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
# Basic locations files
|
||||||
|
location = /favicon.ico {
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
expires max;
|
||||||
|
}
|
||||||
|
location = /robots.txt {
|
||||||
|
# Some WordPress plugin gererate robots.txt file
|
||||||
|
# Refer #340 issue
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
# Cache static files
|
||||||
|
location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|swf)$ {
|
||||||
|
add_header "Access-Control-Allow-Origin" "*";
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
expires max;
|
||||||
|
}
|
||||||
|
# Security settings for better privacy
|
||||||
|
# Deny hidden files
|
||||||
|
location ~ /\.well-known {
|
||||||
|
allow all;
|
||||||
|
}
|
||||||
|
location ~ /\. {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
# Deny backup extensions & log files
|
||||||
|
location ~* ^.+\.(bak|log|old|orig|original|php#|php~|php_bak|save|swo|swp|sql)$ {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
# Return 403 forbidden for readme.(txt|html) or license.(txt|html) or example.(txt|html)
|
||||||
|
if ($uri ~* "^.+(readme|license|example)\.(txt|html)$") {
|
||||||
|
return 403;
|
||||||
|
}
|
||||||
|
# Status pages
|
||||||
|
location = /nginx_status {
|
||||||
|
stub_status on;
|
||||||
|
access_log off;
|
||||||
|
include common/acl.conf;
|
||||||
|
}
|
||||||
|
location ~ ^/(status|ping)$ {
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php;
|
||||||
|
include common/acl.conf;
|
||||||
|
}
|
||||||
|
# WordOps (wo) utilities
|
||||||
|
# phpMyAdmin settings
|
||||||
|
location = /pma {
|
||||||
|
return 301 https://$host:22222/db/pma;
|
||||||
|
}
|
||||||
|
location = /phpMyAdmin {
|
||||||
|
return 301 https://$host:22222/db/pma;
|
||||||
|
}
|
||||||
|
location = /phpmyadmin {
|
||||||
|
return 301 https://$host:22222/db/pma;
|
||||||
|
}
|
||||||
|
# Adminer settings
|
||||||
|
location = /adminer {
|
||||||
|
return 301 https://$host:22222/db/adminer;
|
||||||
|
}
|
||||||
60
wo/cli/templates/nginx-core.mustache
Normal file
60
wo/cli/templates/nginx-core.mustache
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
##
|
||||||
|
# WordOps Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
server_tokens off;
|
||||||
|
reset_timedout_connection on;
|
||||||
|
add_header X-Powered-By "WordOps {{version}}";
|
||||||
|
|
||||||
|
# Limit Request
|
||||||
|
limit_req_status 403;
|
||||||
|
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
|
||||||
|
|
||||||
|
# Proxy Settings
|
||||||
|
# set_real_ip_from proxy-server-ip;
|
||||||
|
# real_ip_header X-Forwarded-For;
|
||||||
|
|
||||||
|
fastcgi_read_timeout 300;
|
||||||
|
client_max_body_size 100m;
|
||||||
|
|
||||||
|
# SSL Settings
|
||||||
|
ssl_protocols TLSv1.1 TLSv1.2;
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_session_timeout 10m;
|
||||||
|
{{#Ubuntu}}
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
{{/Ubuntu}}
|
||||||
|
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
|
||||||
|
|
||||||
|
# Log format Settings
|
||||||
|
log_format rt_cache '$remote_addr $upstream_response_time $upstream_cache_status [$time_local] '
|
||||||
|
'$http_host "$request" $status $body_bytes_sent '
|
||||||
|
'"$http_referer" "$http_user_agent"';
|
||||||
|
|
||||||
|
|
||||||
|
# GZip settings
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_buffers 16 8k;
|
||||||
|
gzip_http_version 1.1;
|
||||||
|
# Compress all output labeled with one of the following MIME-types.
|
||||||
|
gzip_types
|
||||||
|
application/atom+xml
|
||||||
|
application/javascript
|
||||||
|
application/json
|
||||||
|
application/rss+xml
|
||||||
|
application/vnd.ms-fontobject
|
||||||
|
application/x-font-ttf
|
||||||
|
application/x-web-app-manifest+json
|
||||||
|
application/xhtml+xml
|
||||||
|
application/xml
|
||||||
|
font/opentype
|
||||||
|
image/svg+xml
|
||||||
|
image/x-icon
|
||||||
|
text/css
|
||||||
|
text/plain
|
||||||
|
text/x-component
|
||||||
|
text/xml
|
||||||
|
text/javascript;
|
||||||
|
# text/html is always compressed by HttpGzipModule
|
||||||
5
wo/cli/templates/php-fpm.mustache
Normal file
5
wo/cli/templates/php-fpm.mustache
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[global]
|
||||||
|
pid = {{pid}}
|
||||||
|
error_log = {{error_log}}
|
||||||
|
log_level = notice
|
||||||
|
include = {{include}}
|
||||||
10
wo/cli/templates/php-hhvm.mustache
Normal file
10
wo/cli/templates/php-hhvm.mustache
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# PHP NGINX CONFIGURATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass hhvm;
|
||||||
|
}
|
||||||
10
wo/cli/templates/php.mustache
Normal file
10
wo/cli/templates/php.mustache
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# PHP NGINX CONFIGURATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php;
|
||||||
|
}
|
||||||
10
wo/cli/templates/php7.mustache
Normal file
10
wo/cli/templates/php7.mustache
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# PHP NGINX CONFIGURATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php7;
|
||||||
|
}
|
||||||
58
wo/cli/templates/redis-hhvm.mustache
Normal file
58
wo/cli/templates/redis-hhvm.mustache
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# Redis NGINX CONFIGURATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
set $skip_cache 0;
|
||||||
|
# POST requests and URL with a query string should always go to php
|
||||||
|
if ($request_method = POST) {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
if ($query_string != "") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't cache URL containing the following segments
|
||||||
|
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*\.php|index.php|/feed/|.*sitemap.*\.xml)") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't use the cache for logged in users or recent commenter or customer with items in cart
|
||||||
|
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Use cached or actual file if they exists, Otherwise pass request to WordPress
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /redis-fetch {
|
||||||
|
internal ;
|
||||||
|
set $redis_key $args;
|
||||||
|
redis_pass redis;
|
||||||
|
}
|
||||||
|
location /redis-store {
|
||||||
|
internal ;
|
||||||
|
set_unescape_uri $key $arg_key ;
|
||||||
|
redis2_query set $key $echo_request_body;
|
||||||
|
redis2_query expire $key 14400;
|
||||||
|
redis2_pass redis;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
set $key "nginx-cache:$scheme$request_method$host$request_uri";
|
||||||
|
try_files $uri =404;
|
||||||
|
|
||||||
|
srcache_fetch_skip $skip_cache;
|
||||||
|
srcache_store_skip $skip_cache;
|
||||||
|
|
||||||
|
srcache_response_cache_control off;
|
||||||
|
|
||||||
|
set_escape_uri $escaped_key $key;
|
||||||
|
|
||||||
|
srcache_fetch GET /redis-fetch $key;
|
||||||
|
srcache_store PUT /redis-store key=$escaped_key;
|
||||||
|
|
||||||
|
more_set_headers 'X-SRCache-Fetch-Status $srcache_fetch_status';
|
||||||
|
more_set_headers 'X-SRCache-Store-Status $srcache_store_status';
|
||||||
|
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_param HTTP_ACCEPT_ENCODING "";
|
||||||
|
fastcgi_pass hhvm;
|
||||||
|
}
|
||||||
56
wo/cli/templates/redis-php7.mustache
Normal file
56
wo/cli/templates/redis-php7.mustache
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Redis NGINX CONFIGURATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
set $skip_cache 0;
|
||||||
|
# POST requests and URL with a query string should always go to php
|
||||||
|
if ($request_method = POST) {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
if ($query_string != "") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't cache URL containing the following segments
|
||||||
|
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*\.php|index.php|/feed/|.*sitemap.*\.xml)") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't use the cache for logged in users or recent commenter or customer with items in cart
|
||||||
|
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Use cached or actual file if they exists, Otherwise pass request to WordPress
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /redis-fetch {
|
||||||
|
internal ;
|
||||||
|
set $redis_key $args;
|
||||||
|
redis_pass redis;
|
||||||
|
}
|
||||||
|
location /redis-store {
|
||||||
|
internal ;
|
||||||
|
set_unescape_uri $key $arg_key ;
|
||||||
|
redis2_query set $key $echo_request_body;
|
||||||
|
redis2_query expire $key 14400;
|
||||||
|
redis2_pass redis;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
set $key "nginx-cache:$scheme$request_method$host$request_uri";
|
||||||
|
try_files $uri =404;
|
||||||
|
|
||||||
|
srcache_fetch_skip $skip_cache;
|
||||||
|
srcache_store_skip $skip_cache;
|
||||||
|
|
||||||
|
srcache_response_cache_control off;
|
||||||
|
|
||||||
|
set_escape_uri $escaped_key $key;
|
||||||
|
|
||||||
|
srcache_fetch GET /redis-fetch $key;
|
||||||
|
srcache_store PUT /redis-store key=$escaped_key;
|
||||||
|
|
||||||
|
more_set_headers 'X-SRCache-Fetch-Status $srcache_fetch_status';
|
||||||
|
more_set_headers 'X-SRCache-Store-Status $srcache_store_status';
|
||||||
|
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php7;
|
||||||
|
}
|
||||||
57
wo/cli/templates/redis.mustache
Normal file
57
wo/cli/templates/redis.mustache
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
# Redis NGINX CONFIGURATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
set $skip_cache 0;
|
||||||
|
# POST requests and URL with a query string should always go to php
|
||||||
|
if ($request_method = POST) {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
if ($query_string != "") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't cache URL containing the following segments
|
||||||
|
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*\.php|index.php|/feed/|.*sitemap.*\.xml)") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't use the cache for logged in users or recent commenter or customer with items in cart
|
||||||
|
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Use cached or actual file if they exists, Otherwise pass request to WordPress
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /redis-fetch {
|
||||||
|
internal ;
|
||||||
|
set $redis_key $args;
|
||||||
|
redis_pass redis;
|
||||||
|
}
|
||||||
|
location /redis-store {
|
||||||
|
internal ;
|
||||||
|
set_unescape_uri $key $arg_key ;
|
||||||
|
redis2_query set $key $echo_request_body;
|
||||||
|
redis2_query expire $key 14400;
|
||||||
|
redis2_pass redis;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
set $key "nginx-cache:$scheme$request_method$host$request_uri";
|
||||||
|
try_files $uri =404;
|
||||||
|
|
||||||
|
srcache_fetch_skip $skip_cache;
|
||||||
|
srcache_store_skip $skip_cache;
|
||||||
|
|
||||||
|
srcache_response_cache_control off;
|
||||||
|
|
||||||
|
set_escape_uri $escaped_key $key;
|
||||||
|
|
||||||
|
srcache_fetch GET /redis-fetch $key;
|
||||||
|
srcache_store PUT /redis-store key=$escaped_key;
|
||||||
|
|
||||||
|
more_set_headers 'X-SRCache-Fetch-Status $srcache_fetch_status';
|
||||||
|
more_set_headers 'X-SRCache-Store-Status $srcache_store_status';
|
||||||
|
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php;
|
||||||
|
}
|
||||||
15
wo/cli/templates/siteinfo.mustache
Normal file
15
wo/cli/templates/siteinfo.mustache
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
Information about {{domain}}:
|
||||||
|
|
||||||
|
Nginx configuration {{type}} {{enable}}
|
||||||
|
{{#php_version}}PHP Version {{php_version}}{{/php_version}}
|
||||||
|
{{#hhvm}}HHVM {{hhvm}}{{/hhvm}}
|
||||||
|
{{#ssl}}SSL {{ssl}}{{/ssl}}
|
||||||
|
{{#sslprovider}}SSL PROVIDER {{sslprovider}}{{/sslprovider}}
|
||||||
|
{{#sslexpiry}}SSL EXPIRY DATE {{sslexpiry}}{{/sslexpiry}}
|
||||||
|
access_log {{accesslog}}
|
||||||
|
error_log {{errorlog}}
|
||||||
|
{{#webroot}}Webroot {{webroot}}{{/webroot}}
|
||||||
|
{{#dbname}}DB_NAME {{dbname}}{{/dbname}}
|
||||||
|
{{#dbname}}DB_USER {{dbuser}}{{/dbname}}
|
||||||
|
{{#dbname}}DB_PASS {{dbpass}}{{/dbname}}
|
||||||
|
{{#tablepref}}table_prefix {{tableprefix}}{{/tablepref}}
|
||||||
26
wo/cli/templates/upstream.mustache
Normal file
26
wo/cli/templates/upstream.mustache
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Common upstream settings
|
||||||
|
upstream php {
|
||||||
|
# server unix:/run/php5-fpm.sock;
|
||||||
|
server 127.0.0.1:{{php}};
|
||||||
|
}
|
||||||
|
upstream debug {
|
||||||
|
# Debug Pool
|
||||||
|
server 127.0.0.1:{{debug}};
|
||||||
|
}
|
||||||
|
{{#php7conf}}
|
||||||
|
upstream php7 {
|
||||||
|
server 127.0.0.1:{{php7}};
|
||||||
|
}
|
||||||
|
upstream debug7 {
|
||||||
|
# Debug Pool
|
||||||
|
server 127.0.0.1:{{debug7}};
|
||||||
|
}
|
||||||
|
{{/php7conf}}
|
||||||
|
|
||||||
|
{{#hhvmconf}}
|
||||||
|
upstream hhvm {
|
||||||
|
# HHVM Pool
|
||||||
|
server 127.0.0.1:{{hhvm}};
|
||||||
|
server 127.0.0.1:{{php}} backup;
|
||||||
|
}
|
||||||
|
{{/hhvmconf}}
|
||||||
47
wo/cli/templates/virtualconf-php7.mustache
Normal file
47
wo/cli/templates/virtualconf-php7.mustache
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
|
||||||
|
server {
|
||||||
|
|
||||||
|
{{#multisite}}
|
||||||
|
# Uncomment the following line for domain mapping
|
||||||
|
# listen 80 default_server;
|
||||||
|
{{/multisite}}
|
||||||
|
|
||||||
|
server_name {{^vma}}{{^rc}}{{site_name}}{{/rc}}{{/vma}} {{#vma}}vma.*{{/vma}} {{#rc}}webmail.*{{/rc}} {{^vma}}{{^rc}}{{#multisite}}*{{/multisite}}{{^multisite}}www{{/multisite}}.{{site_name}}{{/rc}}{{/vma}};
|
||||||
|
|
||||||
|
{{#multisite}}
|
||||||
|
# Uncomment the following line for domain mapping
|
||||||
|
#server_name_in_redirect off;
|
||||||
|
{{/multisite}}
|
||||||
|
|
||||||
|
access_log /var/log/nginx/{{site_name}}.access.log {{^wpredis}}{{^static}}rt_cache{{/static}}{{/wpredis}}{{#wpredis}}rt_cache_redis{{/wpredis}};
|
||||||
|
error_log /var/log/nginx/{{site_name}}.error.log;
|
||||||
|
|
||||||
|
{{#proxy}}
|
||||||
|
add_header X-Proxy-Cache $upstream_cache_status;
|
||||||
|
location / {
|
||||||
|
proxy_pass http://{{host}}:{{port}};
|
||||||
|
proxy_redirect off;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
{{/proxy}}
|
||||||
|
|
||||||
|
{{^proxy}}
|
||||||
|
{{^vma}}{{^rc}}root {{webroot}}/htdocs;{{/rc}}{{/vma}}
|
||||||
|
|
||||||
|
{{^proxy}}index {{^static}}index.php{{/static}} index.html index.htm;{{/proxy}}
|
||||||
|
|
||||||
|
{{#static}}
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ =404;
|
||||||
|
}
|
||||||
|
{{/static}}
|
||||||
|
|
||||||
|
{{^static}}include {{^hhvm}}{{#basic}}common/php7.conf;{{/basic}}{{#wpfc}}common/wpfc-php7.conf;{{/wpfc}} {{#wpsc}}common/wpsc-php7.conf;{{/wpsc}}{{#wpredis}}common/redis-php7.conf;{{/wpredis}} {{/hhvm}}{{#hhvm}}{{#basic}}common/php-hhvm.conf;{{/basic}}{{#wpfc}}common/wpfc-hhvm.conf;{{/wpfc}} {{#wpsc}}common/wpsc-hhvm.conf;{{/wpsc}}{{#wpredis}}common/redis-hhvm.conf;{{/wpredis}} {{/hhvm}}
|
||||||
|
{{#wpsubdir}}include common/wpsubdir.conf;{{/wpsubdir}}{{/static}}
|
||||||
|
{{#wp}}include common/wpcommon-php7.conf;{{/wp}}
|
||||||
|
{{^proxy}}include common/locations-php7.conf;{{/proxy}}
|
||||||
|
{{^vma}}{{^rc}}include {{webroot}}/conf/nginx/*.conf;{{/rc}}{{/vma}}
|
||||||
|
{{/proxy}}
|
||||||
|
}
|
||||||
46
wo/cli/templates/virtualconf.mustache
Normal file
46
wo/cli/templates/virtualconf.mustache
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
server {
|
||||||
|
|
||||||
|
{{#multisite}}
|
||||||
|
# Uncomment the following line for domain mapping
|
||||||
|
# listen 80 default_server;
|
||||||
|
{{/multisite}}
|
||||||
|
|
||||||
|
server_name {{^vma}}{{^rc}}{{site_name}}{{/rc}}{{/vma}} {{#vma}}vma.*{{/vma}} {{#rc}}webmail.*{{/rc}} {{^vma}}{{^rc}}{{#multisite}}*{{/multisite}}{{^multisite}}www{{/multisite}}.{{site_name}}{{/rc}}{{/vma}};
|
||||||
|
|
||||||
|
{{#multisite}}
|
||||||
|
# Uncomment the following line for domain mapping
|
||||||
|
#server_name_in_redirect off;
|
||||||
|
{{/multisite}}
|
||||||
|
|
||||||
|
access_log /var/log/nginx/{{site_name}}.access.log {{^wpredis}}{{^static}}rt_cache{{/static}}{{/wpredis}}{{#wpredis}}rt_cache_redis{{/wpredis}};
|
||||||
|
error_log /var/log/nginx/{{site_name}}.error.log;
|
||||||
|
|
||||||
|
{{#proxy}}
|
||||||
|
add_header X-Proxy-Cache $upstream_cache_status;
|
||||||
|
location / {
|
||||||
|
proxy_pass http://{{host}}:{{port}};
|
||||||
|
proxy_redirect off;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
{{/proxy}}
|
||||||
|
|
||||||
|
{{^proxy}}
|
||||||
|
{{^vma}}{{^rc}}root {{webroot}}/htdocs;{{/rc}}{{/vma}}
|
||||||
|
|
||||||
|
{{^proxy}}index {{^static}}index.php{{/static}} index.html index.htm;{{/proxy}}
|
||||||
|
|
||||||
|
{{#static}}
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ =404;
|
||||||
|
}
|
||||||
|
{{/static}}
|
||||||
|
|
||||||
|
{{^static}}include {{^hhvm}}{{#basic}}common/php.conf;{{/basic}}{{#wpfc}}common/wpfc.conf;{{/wpfc}} {{#wpsc}}common/wpsc.conf;{{/wpsc}}{{#wpredis}}common/redis.conf;{{/wpredis}} {{/hhvm}}{{#hhvm}}{{#basic}}common/php-hhvm.conf;{{/basic}}{{#wpfc}}common/wpfc-hhvm.conf;{{/wpfc}} {{#wpsc}}common/wpsc-hhvm.conf;{{/wpsc}}{{#wpredis}}common/redis-hhvm.conf;{{/wpredis}} {{/hhvm}} {{#wpsubdir}}include common/wpsubdir.conf;{{/wpsubdir}}{{/static}}
|
||||||
|
{{#wp}}include common/wpcommon.conf;{{/wp}}
|
||||||
|
{{^proxy}}include common/locations.conf;{{/proxy}}
|
||||||
|
{{^vma}}{{^rc}}include {{webroot}}/conf/nginx/*.conf;{{/rc}}{{/vma}}
|
||||||
|
{{/proxy}}
|
||||||
|
}
|
||||||
83
wo/cli/templates/wo-plus.mustache
Normal file
83
wo/cli/templates/wo-plus.mustache
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
##
|
||||||
|
# WordOps Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
|
||||||
|
tcp_nopush on;
|
||||||
|
tcp_nodelay on;
|
||||||
|
types_hash_max_size 2048;
|
||||||
|
|
||||||
|
server_tokens off;
|
||||||
|
reset_timedout_connection on;
|
||||||
|
add_header X-Powered-By "WordOps {{ version }}";
|
||||||
|
|
||||||
|
# Limit Request
|
||||||
|
limit_req_status 403;
|
||||||
|
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
|
||||||
|
|
||||||
|
# Proxy Settings
|
||||||
|
# set_real_ip_from proxy-server-ip;
|
||||||
|
# real_ip_header X-Forwarded-For;
|
||||||
|
|
||||||
|
fastcgi_read_timeout 300;
|
||||||
|
client_max_body_size 100m;
|
||||||
|
|
||||||
|
##
|
||||||
|
# SSL Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
ssl_session_cache shared:SSL:5m;
|
||||||
|
ssl_session_timeout 10m;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
|
||||||
|
ssl_protocols TLSv1.1 TLSv1.2;
|
||||||
|
|
||||||
|
##
|
||||||
|
# Basic Settings
|
||||||
|
##
|
||||||
|
server_names_hash_bucket_size 16384;
|
||||||
|
# server_name_in_redirect off;
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# Logging Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
access_log /var/log/nginx/access.log;
|
||||||
|
error_log /var/log/nginx/error.log;
|
||||||
|
|
||||||
|
# Log format Settings
|
||||||
|
log_format rt_cache '$remote_addr $upstream_response_time $upstream_cache_status [$time_local] '
|
||||||
|
'$http_host "$request" $status $body_bytes_sent '
|
||||||
|
'"$http_referer" "$http_user_agent" "$request_body"';
|
||||||
|
|
||||||
|
##
|
||||||
|
# Gzip Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
gzip_disable "msie6";
|
||||||
|
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_buffers 16 8k;
|
||||||
|
gzip_http_version 1.1;
|
||||||
|
gzip_types
|
||||||
|
application/atom+xml
|
||||||
|
application/javascript
|
||||||
|
application/json
|
||||||
|
application/rss+xml
|
||||||
|
application/vnd.ms-fontobject
|
||||||
|
application/x-font-ttf
|
||||||
|
application/x-web-app-manifest+json
|
||||||
|
application/xhtml+xml
|
||||||
|
application/xml
|
||||||
|
font/opentype
|
||||||
|
image/svg+xml
|
||||||
|
image/x-icon
|
||||||
|
text/css
|
||||||
|
text/plain
|
||||||
|
text/x-component
|
||||||
|
text/xml
|
||||||
|
text/javascript;
|
||||||
21
wo/cli/templates/wpcommon-php7.mustache
Normal file
21
wo/cli/templates/wpcommon-php7.mustache
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# WordPress COMMON SETTINGS
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
# Limit access to avoid brute force attack
|
||||||
|
location = /wp-login.php {
|
||||||
|
limit_req zone=one burst=1 nodelay;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php7;
|
||||||
|
}
|
||||||
|
# Disable wp-config.txt
|
||||||
|
location = /wp-config.txt {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
# Disallow php in upload folder
|
||||||
|
location /wp-content/uploads/ {
|
||||||
|
location ~ \.php$ {
|
||||||
|
#Prevent Direct Access Of PHP Files From Web Browsers
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
}
|
||||||
21
wo/cli/templates/wpcommon.mustache
Normal file
21
wo/cli/templates/wpcommon.mustache
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# WordPress COMMON SETTINGS
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
# Limit access to avoid brute force attack
|
||||||
|
location = /wp-login.php {
|
||||||
|
limit_req zone=one burst=1 nodelay;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php;
|
||||||
|
}
|
||||||
|
# Disable wp-config.txt
|
||||||
|
location = /wp-config.txt {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
# Disallow php in upload folder
|
||||||
|
location /wp-content/uploads/ {
|
||||||
|
location ~ \.php$ {
|
||||||
|
#Prevent Direct Access Of PHP Files From Web Browsers
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
}
|
||||||
37
wo/cli/templates/wpfc-hhvm.mustache
Normal file
37
wo/cli/templates/wpfc-hhvm.mustache
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# WPFC NGINX CONFIGURATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
set $skip_cache 0;
|
||||||
|
# POST requests and URL with a query string should always go to php
|
||||||
|
if ($request_method = POST) {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
if ($query_string != "") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't cache URL containing the following segments
|
||||||
|
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*\.php|index.php|/feed/|.*sitemap.*\.xml)") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't use the cache for logged in users or recent commenter or customer with items in cart
|
||||||
|
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Use cached or actual file if they exists, Otherwise pass request to WordPress
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
location ~ ^/wp-content/cache/minify/(.+\.(css|js))$ {
|
||||||
|
try_files $uri /wp-content/plugins/w3-total-cache/pub/minify.php?file=$1;
|
||||||
|
}
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass hhvm;
|
||||||
|
fastcgi_cache_bypass $skip_cache;
|
||||||
|
fastcgi_no_cache $skip_cache;
|
||||||
|
fastcgi_cache WORDPRESS;
|
||||||
|
}
|
||||||
|
location ~ /purge(/.*) {
|
||||||
|
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
|
||||||
|
access_log off;
|
||||||
|
}
|
||||||
37
wo/cli/templates/wpfc-php7.mustache
Normal file
37
wo/cli/templates/wpfc-php7.mustache
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# WPFC NGINX CONFIGURATION
|
||||||
|
# DO NOT MODIFY, ALL CHANGES WILL BE LOST AFTER AN WordOps (wo) UPDATE
|
||||||
|
set $skip_cache 0;
|
||||||
|
# POST requests and URL with a query string should always go to php
|
||||||
|
if ($request_method = POST) {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
if ($query_string != "") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't cache URL containing the following segments
|
||||||
|
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*\.php|index.php|/feed/|.*sitemap.*\.xml)") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Don't use the cache for logged in users or recent commenter or customer with items in cart
|
||||||
|
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart") {
|
||||||
|
set $skip_cache 1;
|
||||||
|
}
|
||||||
|
# Use cached or actual file if they exists, Otherwise pass request to WordPress
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
location ~ ^/wp-content/cache/minify/(.+\.(css|js))$ {
|
||||||
|
try_files $uri /wp-content/plugins/w3-total-cache/pub/minify.php?file=$1;
|
||||||
|
}
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass php7;
|
||||||
|
fastcgi_cache_bypass $skip_cache;
|
||||||
|
fastcgi_no_cache $skip_cache;
|
||||||
|
fastcgi_cache WORDPRESS;
|
||||||
|
}
|
||||||
|
location ~ /purge(/.*) {
|
||||||
|
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
|
||||||
|
access_log off;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user