gau1991
10 years ago
112 changed files with 9574 additions and 145 deletions
@ -0,0 +1,65 @@ |
|||||
|
# Byte-compiled / optimized / DLL files |
||||
|
__pycache__/ |
||||
|
*.py[cod] |
||||
|
|
||||
|
# 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/ |
@ -0,0 +1,21 @@ |
|||||
|
The MIT License (MIT) |
||||
|
|
||||
|
Copyright (c) 2015 rtCamp Solutions Private Limited |
||||
|
|
||||
|
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. |
@ -0,0 +1,96 @@ |
|||||
|
IMPORTANT |
||||
|
============================================ |
||||
|
|
||||
|
#### We are looking for [Python Developers] (https://rtcamp.com/careers/python-developer/) to join our team. We offer work from home, so you can join EasyEngine team anywhere! _[Why Python?] (https://rtcamp.com/blog/easyengine-3-roadmap/#whypython)_ |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
[![Stories in Ready](https://badge.waffle.io/rtcamp/easyengine.png?label=ready&title=Ready)](https://waffle.io/rtcamp/easyengine) |
||||
|
[![Stories in Progress](https://badge.waffle.io/rtcamp/easyengine.png?label=in%20progress&title=In%20Progress)](https://waffle.io/rtcamp/easyengine) |
||||
|
|
||||
|
<img src="https://d3qt5vpr7p9rgn.cloudfront.net/wp-content/uploads/2013/08/easy-engine-logo-2-RS1.png" alt="EasyEngine Logo" align="right" /> |
||||
|
|
||||
|
[![Travis Build Status](https://travis-ci.org/rtCamp/easyengine.svg "Travis Build Status")] (https://travis-ci.org/rtCamp/easyengine) |
||||
|
|
||||
|
EasyEngine (ee) is a python tool, which makes it easy to manage your wordpress sites running on nginx web-server. |
||||
|
|
||||
|
**EasyEngine currently supports:** |
||||
|
|
||||
|
- Ubuntu 12.04 & 14.04 |
||||
|
- Debian 7 |
||||
|
|
||||
|
|
||||
|
## Quick Start |
||||
|
|
||||
|
```bash |
||||
|
wget -q http://rt.cx/ee && sudo bash ee # install easyengine 3.0.0-beta |
||||
|
sudo ee site create example.com --wp # Install required packages & setup WordPress on example.com |
||||
|
``` |
||||
|
|
||||
|
## Update EasyEngine |
||||
|
|
||||
|
|
||||
|
Update Procedure For EasyEngine to version 3.0 |
||||
|
|
||||
|
```bash |
||||
|
wget -q http://rt.cx/ee && sudo bash ee |
||||
|
``` |
||||
|
|
||||
|
## More Site Creation Commands |
||||
|
|
||||
|
### Standard WordPress Sites |
||||
|
|
||||
|
```bash |
||||
|
ee site create example.com --wp # install wordpress without any page caching |
||||
|
ee site create example.com --w3tc # install wordpress with w3-total-cache plugin |
||||
|
ee site create example.com --wpsc # install wordpress with wp-super-cache plugin |
||||
|
ee site create example.com --wpfc # install wordpress + nginx fastcgi_cache |
||||
|
``` |
||||
|
|
||||
|
### WordPress Multsite with subdirectory |
||||
|
|
||||
|
```bash |
||||
|
ee site create example.com --wpsubdir # install wpmu-subdirectory without any page caching |
||||
|
ee site create example.com --wpsubdir --w3tc # install wpmu-subdirectory with w3-total-cache plugin |
||||
|
ee site create example.com --wpsubdir --wpsc # install wpmu-subdirectory with wp-super-cache plugin |
||||
|
ee site create example.com --wpsubdir --wpfc # install wpmu-subdirectory + nginx fastcgi_cache |
||||
|
``` |
||||
|
|
||||
|
### WordPress Multsite with subdomain |
||||
|
|
||||
|
```bash |
||||
|
ee site create example.com --wpsubdomin # install wpmu-subdomain without any page caching |
||||
|
ee site create example.com --wpsubdomain --w3tc # install wpmu-subdomain with w3-total-cache plugin |
||||
|
ee site create example.com --wpsubdomain --wpsc # install wpmu-subdomain with wp-super-cache plugin |
||||
|
ee site create example.com --wpsubdomain --wpfc # install wpmu-subdomain + nginx fastcgi_cache |
||||
|
``` |
||||
|
|
||||
|
### Non-WordPress Sites |
||||
|
```bash |
||||
|
ee site create example.com --html # create example.com for static/html sites |
||||
|
ee site create example.com --php # create example.com with php support |
||||
|
ee site create example.com --mysql # create example.com with php & mysql 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 | |
||||
|
| **W3 Total Cache** | --w3tc | --wpsubdir --w3tc | --wpsubdomain --w3tc | |
||||
|
| **Nginx cache** | --wpfc | --wpsubdir --wpfc | --wpsubdomain --wpfc | |
||||
|
|
||||
|
|
||||
|
## Useful Links |
||||
|
- [Documentation] (http://docs.rtcamp.com/easyengine/docs/) |
||||
|
- [FAQ] (http://docs.rtcamp.com/easyengine/faq/) |
||||
|
- [Conventions used] (http://rtcamp.com/wordpress-nginx/tutorials/conventions/) |
||||
|
|
||||
|
## Donations |
||||
|
|
||||
|
[![Donate](https://cloud.githubusercontent.com/assets/4115/5297691/c7b50292-7bd7-11e4-987b-2dc21069e756.png)] (https://rtcamp.com/donate/?project=easyengine) |
||||
|
|
||||
|
## License |
||||
|
[MIT] (http://opensource.org/licenses/MIT) |
@ -0,0 +1,176 @@ |
|||||
|
_ee_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 "ee") |
||||
|
if [ $COMP_CWORD -eq 1 ]; then |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "stack site debug clean secure" \ |
||||
|
-- $cur) ) |
||||
|
|
||||
|
|
||||
|
# SETUP THE SECOND LEVEL (EVERYTHING AFTER "ee second") |
||||
|
elif [ $COMP_CWORD -eq 2 ]; then |
||||
|
case "$prev" in |
||||
|
|
||||
|
# HANDLE EVERYTHING AFTER THE SECOND LEVEL NAMESPACE |
||||
|
"clean") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "--memcache --opcache --fastcgi --all" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
# IF YOU HAD ANOTHER CONTROLLER, YOU'D HANDLE THAT HERE |
||||
|
"debug") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "--start --nginx --php --fpm --mysql -i --interactive --stop " \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
"stack") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "install purge reload remove restart start status stop" \ |
||||
|
-- $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 --nginx" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
# EVERYTHING ELSE |
||||
|
*) |
||||
|
;; |
||||
|
esac |
||||
|
|
||||
|
# SETUP THE THIRD LEVEL (EVERYTHING AFTER "ee second third") |
||||
|
elif [ $COMP_CWORD -eq 3 ]; then |
||||
|
case "$prev" in |
||||
|
# HANDLE EVERYTHING AFTER THE THIRD LEVEL NAMESPACE |
||||
|
"install" | "purge" | "remove" | "start" | "stop" | "reload") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "--web --admin --mail --nginx --php --mysql --postfix --wpcli --phpmyadmin --adminer --utils --memcache --dovecot" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
"list") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "--enabled --disabled" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
"edit" | "enable" | "info" | "log" | "show" | "cd" | "update" | "delete") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "$(find /etc/nginx/sites-available/ -type f -printf "%P " 2> /dev/null)" \ |
||||
|
-- $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" != "--fpm" ] || [ "$prev" != "--mysql" ] || [ "$prev" != "-i" ] || ["$prev" != "--interactive" ] || ["$prev" != "--stop" ]); then |
||||
|
retlist="--start --stop --wp --rewrite -i" |
||||
|
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 "--html --php --mysql --wp --wpsubdir --wpsubdomain --w3tc --wpfc --wpsc" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
"update") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "--password --php --mysql --wp --wpsubdir --wpsubdomain --w3tc --wpfc --wpsc" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
"delete") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "--db --files --all" \ |
||||
|
-- $cur) ) |
||||
|
|
||||
|
esac |
||||
|
fi |
||||
|
|
||||
|
case "$prev" in |
||||
|
"--wpsubdir" | "--wpsubdomain") |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "--w3tc --wpfc --wpsc" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
"--web" | "--admin" | "--mail" | "--nginx" | "--php" | "--mysql" | "--postfix" | "--wpcli" | "--phpmyadmin" | "--adminer" | "--utils" | "--memcache" | "--dovecot") |
||||
|
if [[ ${COMP_WORDS[1]} == "stack" ]]; then |
||||
|
retlist="--web --admin --mail --nginx --php --mysql --postfix --wpcli --phpmyadmin --adminer --utils --memcache --dovecot" |
||||
|
elif [[ ${COMP_WORDS[1]} == "debug" ]]; then |
||||
|
retlist="--start --nginx --php --fpm --mysql -i --interactive --stop" |
||||
|
fi |
||||
|
ret="${retlist[@]/$prev}" |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "$(echo $ret)" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
"--db" | "--files" | "--all") |
||||
|
retlist="--db --files --all" |
||||
|
ret="${retlist[@]/$prev}" |
||||
|
COMPREPLY=( $(compgen \ |
||||
|
-W "$(echo $ret)" \ |
||||
|
-- $cur) ) |
||||
|
;; |
||||
|
|
||||
|
"--memcache" | "--opcache" | "--fastcgi" | "--all") |
||||
|
retlist="--memcache --opcache --fastcgi --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) ) |
||||
|
;; |
||||
|
*) |
||||
|
;; |
||||
|
esac |
||||
|
|
||||
|
return 0 |
||||
|
|
||||
|
} && |
||||
|
complete -F _ee_complete ee |
@ -0,0 +1,69 @@ |
|||||
|
# EasyEngine Configuration |
||||
|
# |
||||
|
# All commented values are the application default |
||||
|
# |
||||
|
|
||||
|
[ee] |
||||
|
|
||||
|
### Toggle application level debug (does not toggle framework debugging) |
||||
|
# debug = false |
||||
|
|
||||
|
### Where external (third-party) plugins are loaded from |
||||
|
# plugin_dir = /var/lib/ee/plugins/ |
||||
|
|
||||
|
### Where all plugin configurations are loaded from |
||||
|
# plugin_config_dir = /etc/ee/plugins.d/ |
||||
|
|
||||
|
### Where external templates are loaded from |
||||
|
# template_dir = /var/lib/ee/templates/ |
||||
|
|
||||
|
|
||||
|
[log.logging] |
||||
|
|
||||
|
### Where the log file lives (no log file by default) |
||||
|
file = /var/log/ee/ee.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 = |
@ -0,0 +1,8 @@ |
|||||
|
### Example Plugin Configuration for EasyEngine |
||||
|
|
||||
|
[clean] |
||||
|
|
||||
|
### If enabled, load a plugin named `example` either from the Python module |
||||
|
### `ee.cli.plugins.example` or from the file path |
||||
|
### `/var/lib/ee/plugins/example.py` |
||||
|
enable_plugin = true |
@ -0,0 +1,8 @@ |
|||||
|
### Example Plugin Configuration for EasyEngine |
||||
|
|
||||
|
[debug] |
||||
|
|
||||
|
### If enabled, load a plugin named `example` either from the Python module |
||||
|
### `ee.cli.plugins.example` or from the file path |
||||
|
### `/var/lib/ee/plugins/example.py` |
||||
|
enable_plugin = true |
@ -0,0 +1,8 @@ |
|||||
|
### Example Plugin Configuration for EasyEngine |
||||
|
|
||||
|
[import_slow_log] |
||||
|
|
||||
|
### If enabled, load a plugin named `example` either from the Python module |
||||
|
### `ee.cli.plugins.example` or from the file path |
||||
|
### `/var/lib/ee/plugins/example.py` |
||||
|
enable_plugin = true |
@ -0,0 +1,11 @@ |
|||||
|
### Example Plugin Configuration for EasyEngine |
||||
|
|
||||
|
[info] |
||||
|
|
||||
|
### If enabled, load a plugin named `example` either from the Python module |
||||
|
### `ee.cli.plugins.example` or from the file path |
||||
|
### `/var/lib/ee/plugins/example.py` |
||||
|
enable_plugin = true |
||||
|
|
||||
|
### Additional plugin configuration settings |
||||
|
foo = bar |
@ -0,0 +1,8 @@ |
|||||
|
### Example Plugin Configuration for EasyEngine |
||||
|
|
||||
|
[secure] |
||||
|
|
||||
|
### If enabled, load a plugin named `example` either from the Python module |
||||
|
### `ee.cli.plugins.example` or from the file path |
||||
|
### `/var/lib/ee/plugins/example.py` |
||||
|
enable_plugin = true |
@ -0,0 +1,8 @@ |
|||||
|
### Example Plugin Configuration for EasyEngine |
||||
|
|
||||
|
[site] |
||||
|
|
||||
|
### If enabled, load a plugin named `example` either from the Python module |
||||
|
### `ee.cli.plugins.example` or from the file path |
||||
|
### `/var/lib/ee/plugins/example.py` |
||||
|
enable_plugin = true |
@ -0,0 +1,8 @@ |
|||||
|
### Example Plugin Configuration for EasyEngine |
||||
|
|
||||
|
[stack] |
||||
|
|
||||
|
### If enabled, load a plugin named `example` either from the Python module |
||||
|
### `ee.cli.plugins.example` or from the file path |
||||
|
### `/var/lib/ee/plugins/example.py` |
||||
|
enable_plugin = true |
@ -0,0 +1,312 @@ |
|||||
|
.TH ee 8 "EasyEngine (ee) version: 3.0" "Feb 2,2014" "EasyEngine" |
||||
|
.SH NAME |
||||
|
.B EasyEngine (ee) |
||||
|
\- Manage Nginx Based Websites. |
||||
|
.SH SYNOPSIS |
||||
|
ee [ --version | --help | info | stack | site | debug | update ] |
||||
|
.TP |
||||
|
ee stack [ install | remove | purge ] [ --web | --mail | --all | --nginx | --php | --mysql | --postfix | --adminer | --phpmyadmin | --wpcli | --utils ] |
||||
|
.TP |
||||
|
ee stack [ status | start | stop | reload | restart ] |
||||
|
.TP |
||||
|
ee site [ list | info | show | enable | disable | edit ] [ example.com ] |
||||
|
.TP |
||||
|
ee site create example.com [ --html | --php | --mysql] [[--wp | --wpsubdir | --wpsubdomain ] [--basic | --wpsc | --w3tc | --wpfc]] |
||||
|
.TP |
||||
|
ee site update example.com [ --php | --mysql] [[--wp | --wpsubdir | --wpsubdomain ] [--basic | --wpsc | --w3tc | --wpfc]] |
||||
|
.TP |
||||
|
ee site delete example.com [--db | --files | --all | --no-prompt ] |
||||
|
.TP |
||||
|
ee debug [ -i | --nginx | --rewrite | --php | --fpm | --mysql ] [--stop ] |
||||
|
.TP |
||||
|
ee debug example.com [ -i | --nginx | --rewrite | --wp ] [--stop ] |
||||
|
.TP |
||||
|
ee secure [ --auth | --port | --ip ] |
||||
|
.SH DESCRIPTION |
||||
|
EasyEngine aka ee is the opensource project developed with the purpose to automate web-server configuration. |
||||
|
.br |
||||
|
EasyEngine is the collection of shell scripts that provides automation for the web-server |
||||
|
.br |
||||
|
installation, site creation, services debugging & monitoring. |
||||
|
.SH OPTIONS |
||||
|
.TP |
||||
|
.B --version |
||||
|
.br |
||||
|
Display easyengine (ee) version information. |
||||
|
.TP |
||||
|
.B info |
||||
|
.br |
||||
|
ee info - Display Nginx, PHP, MySQL and ee common location information |
||||
|
.br |
||||
|
ee site info - Diplay given website details like enable, disable. weboot and log files. |
||||
|
.TP |
||||
|
.B --help |
||||
|
.br |
||||
|
Display easyengine (ee) help. |
||||
|
.TP |
||||
|
.B stack |
||||
|
.TP |
||||
|
.B install [ --all | --web | --mail | --nginx | --php | --mysql | --postfix | --adminer | --phpmyadmin | --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 | --mysql | --postfix | --adminer | --phpmyadmin | --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 | --mysql | --postfix | --adminer | --phpmyadmin | --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 services. |
||||
|
.TP |
||||
|
.B start |
||||
|
.br |
||||
|
Start services NGINX, PHP5-FPM, MySQL, Postfix. |
||||
|
.TP |
||||
|
.B stop |
||||
|
.br |
||||
|
Stop services NGINX, PHP5-FPM, MySQL, Postfix. |
||||
|
.TP |
||||
|
.B reload |
||||
|
.br |
||||
|
Reload services NGINX, PHP5-FPM, MySQL, Postfix. |
||||
|
.TP |
||||
|
.B restart |
||||
|
.br |
||||
|
Restart services NGINX, PHP5-FPM, MySQL, Postfix. |
||||
|
.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 [ enable | available ] |
||||
|
.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 | --mysql] [[--wp | --wpsubdir | --wpsubdomain ] [--basic | --wpsc | --w3tc | --wpfc]] |
||||
|
.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 | --mysql] [[--wp | --wpsubdir | --wpsubdomain ] [--basic | --wpsc | --w3tc | --wpfc]] |
||||
|
.br |
||||
|
Update site configuration according to specified options. |
||||
|
.TP |
||||
|
.B delete [ example.com ] [--no-prompt ] [ --db | --files ] |
||||
|
.br |
||||
|
Delete site i.e webroot, database, ad configuration permenantly. |
||||
|
.TP |
||||
|
.B debug [ -i | --nginx | --php | --mysql | --rewrite | --fpm ] [ --start | --stop ] |
||||
|
.br |
||||
|
Starts server level debugging. If used without arguments starts debugging |
||||
|
.br |
||||
|
all services, else debug only service provided with argument. Stop |
||||
|
.br |
||||
|
Debugging if used with --stop argument. |
||||
|
.TP |
||||
|
.B debug example.com [ -i | --nginx | --rewrite | --wp ] [ --start | --stop ] |
||||
|
.br |
||||
|
Starts site level debugging. If used without arguments starts debugging all |
||||
|
.br |
||||
|
services, else debug only service provided with argument. Stop Debugging |
||||
|
.br |
||||
|
if used with --stop argument. |
||||
|
.TP |
||||
|
.B secure [ --auth | --port ] |
||||
|
.br |
||||
|
Update security settings. |
||||
|
.TP |
||||
|
.B clean [ --fastcgi | --opcache | --memcache | --all ] |
||||
|
.br |
||||
|
Clean NGINX fastCGI cache, Opcache, Memcache. |
||||
|
.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 |
||||
|
.br |
||||
|
used with ee debug command. used to start or stop nginx debugging. |
||||
|
.TP |
||||
|
.B --php |
||||
|
.br |
||||
|
used with ee debug command. used to start or stop php debugging. |
||||
|
.TP |
||||
|
.B --mysql |
||||
|
.br |
||||
|
used with ee debug command. used to start or stop mysql debugging. |
||||
|
.TP |
||||
|
.B --rewrite |
||||
|
.br |
||||
|
used with ee debug command. used to start or stop nginx rewrite rules debugging. |
||||
|
.TP |
||||
|
.B --fpm |
||||
|
.br |
||||
|
used with ee debug command. used to start or stop fpm debugging. |
||||
|
.TP |
||||
|
.B --wp |
||||
|
.br |
||||
|
used with ee debug command. used to start or stop wordpress site debugging. |
||||
|
.TP |
||||
|
.B --start |
||||
|
.br |
||||
|
used with ee debug command. used to stop debugging. |
||||
|
.TP |
||||
|
.B --stop |
||||
|
.br |
||||
|
used with ee 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. |
||||
|
.TP |
||||
|
.B --auth |
||||
|
.br |
||||
|
used with ee secure command. Update credential of HTTP authentication |
||||
|
.TP |
||||
|
.B --port |
||||
|
.br |
||||
|
used with ee secure command. Change EasyEngine admin port 22222. |
||||
|
.TP |
||||
|
.B --ip |
||||
|
.br |
||||
|
used with ee secure command. Update whitelist IP address |
||||
|
.SH WORDPRESS CACHING OPTIONS |
||||
|
.TP |
||||
|
.B --basic |
||||
|
.br |
||||
|
Create WordPress website without cache. |
||||
|
.TP |
||||
|
.B --w3tc |
||||
|
.br |
||||
|
Install and activate Nginx-helper and W3 Total Cache plugin. |
||||
|
.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. |
||||
|
.SH FILES |
||||
|
.br |
||||
|
/etc/easyengine/ee.conf |
||||
|
.SH BUGS |
||||
|
Report bugs at <http://github.com/rtCamp/easyengine/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 Shital |
||||
|
.I \<shital.patil@rtcamp.com\> |
||||
|
.br |
||||
|
.SH "SEE ALSO" |
||||
|
.br |
||||
|
EE: |
||||
|
.I https://rtcamp.com/easyengine/ |
||||
|
.br |
||||
|
FAQ: |
||||
|
.I https://rtcamp.com/easyengine/faq/ |
||||
|
.br |
||||
|
DOCS: |
||||
|
.I https://rtcamp.com/easyengine/docs/ |
@ -0,0 +1 @@ |
|||||
|
__import__('pkg_resources').declare_namespace(__name__) |
@ -0,0 +1,11 @@ |
|||||
|
"""EasyEngine bootstrapping.""" |
||||
|
|
||||
|
# All built-in application controllers should be imported, and registered |
||||
|
# in this file in the same way as EEBaseController. |
||||
|
|
||||
|
from cement.core import handler |
||||
|
from ee.cli.controllers.base import EEBaseController |
||||
|
|
||||
|
|
||||
|
def load(app): |
||||
|
handler.register(EEBaseController) |
@ -0,0 +1,25 @@ |
|||||
|
"""EasyEngine base controller.""" |
||||
|
|
||||
|
from cement.core.controller import CementBaseController, expose |
||||
|
from ee.core.variables import EEVariables |
||||
|
VERSION = EEVariables.ee_version |
||||
|
|
||||
|
BANNER = """ |
||||
|
EasyEngine v%s |
||||
|
Copyright (c) 2015 rtCamp Solutions Pvt. Ltd. |
||||
|
""" % VERSION |
||||
|
|
||||
|
|
||||
|
class EEBaseController(CementBaseController): |
||||
|
class Meta: |
||||
|
label = 'base' |
||||
|
description = ("EasyEngine 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,0 +1,116 @@ |
|||||
|
"""EasyEngine 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 ee.core import exc |
||||
|
|
||||
|
# Application default. Should update config/ee.conf to reflect any |
||||
|
# changes, or additions here. |
||||
|
defaults = init_defaults('ee') |
||||
|
|
||||
|
# All internal/external plugin configurations are loaded from here |
||||
|
defaults['ee']['plugin_config_dir'] = '/etc/ee/plugins.d' |
||||
|
|
||||
|
# External plugins (generally, do not ship with application code) |
||||
|
defaults['ee']['plugin_dir'] = '/var/lib/ee/plugins' |
||||
|
|
||||
|
# External templates (generally, do not ship with application code) |
||||
|
defaults['ee']['template_dir'] = '/var/lib/ee/templates' |
||||
|
|
||||
|
|
||||
|
class EEApp(foundation.CementApp): |
||||
|
class Meta: |
||||
|
label = 'ee' |
||||
|
|
||||
|
config_defaults = defaults |
||||
|
|
||||
|
# All built-in application bootstrapping (always run) |
||||
|
bootstrap = 'ee.cli.bootstrap' |
||||
|
|
||||
|
# Optional plugin bootstrapping (only run if plugin is enabled) |
||||
|
plugin_bootstrap = 'ee.cli.plugins' |
||||
|
|
||||
|
# Internal templates (ship with application code) |
||||
|
template_module = 'ee.cli.templates' |
||||
|
|
||||
|
# Internal plugins (ship with application code) |
||||
|
plugin_bootstrap = 'ee.cli.plugins' |
||||
|
|
||||
|
extensions = ['mustache'] |
||||
|
|
||||
|
# default output handler |
||||
|
output_handler = 'mustache' |
||||
|
|
||||
|
debug = TOGGLE_DEBUG |
||||
|
|
||||
|
|
||||
|
class EETestApp(EEApp): |
||||
|
"""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 = EEApp() |
||||
|
|
||||
|
|
||||
|
def main(): |
||||
|
try: |
||||
|
# Default our exit status to 0 (non-error) |
||||
|
code = 0 |
||||
|
|
||||
|
# if not root...kick out |
||||
|
if not os.geteuid() == 0: |
||||
|
print("\nOnly root or sudo user can run this EasyEngine\n") |
||||
|
app.close(1) |
||||
|
|
||||
|
# Setup the application |
||||
|
app.setup() |
||||
|
|
||||
|
# Run the application |
||||
|
app.run() |
||||
|
except exc.EEError 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) |
||||
|
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 = EEApp(**kw) |
||||
|
return app |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
main() |
@ -0,0 +1,89 @@ |
|||||
|
"""Clean Plugin for EasyEngine.""" |
||||
|
|
||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.aptget import EEAptGet |
||||
|
from ee.core.services import EEService |
||||
|
from ee.core.logging import Log |
||||
|
from cement.core.controller import CementBaseController, expose |
||||
|
from cement.core import handler, hook |
||||
|
import os |
||||
|
import urllib.request |
||||
|
|
||||
|
|
||||
|
def clean_plugin_hook(app): |
||||
|
# do something with the ``app`` object here. |
||||
|
pass |
||||
|
|
||||
|
|
||||
|
class EECleanController(CementBaseController): |
||||
|
class Meta: |
||||
|
label = 'clean' |
||||
|
stacked_on = 'base' |
||||
|
stacked_type = 'nested' |
||||
|
description = ('Clean NGINX FastCGI cache, Opcacache, Memcache') |
||||
|
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')) |
||||
|
] |
||||
|
|
||||
|
@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)): |
||||
|
self.clean_fastcgi() |
||||
|
if self.app.pargs.all: |
||||
|
self.clean_memcache() |
||||
|
self.clean_fastcgi() |
||||
|
self.clean_opcache() |
||||
|
if self.app.pargs.fastcgi: |
||||
|
self.clean_fastcgi() |
||||
|
if self.app.pargs.memcache: |
||||
|
self.clean_memcache() |
||||
|
if self.app.pargs.opcache: |
||||
|
self.clean_opcache() |
||||
|
|
||||
|
@expose(hide=True) |
||||
|
def clean_memcache(self): |
||||
|
"""This function Clears memcache""" |
||||
|
try: |
||||
|
if(EEAptGet.is_installed(self, "memcached")): |
||||
|
EEService.restart_service(self, "memcached") |
||||
|
Log.info(self, "Cleaning MemCache") |
||||
|
else: |
||||
|
Log.error(self, "Memcache not installed") |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to restart Memcached") |
||||
|
|
||||
|
@expose(hide=True) |
||||
|
def clean_fastcgi(self): |
||||
|
"""This function clears Fastcgi cache""" |
||||
|
if(os.path.isdir("/var/run/nginx-cache")): |
||||
|
Log.info(self, "Cleaning NGINX FastCGI cache") |
||||
|
EEShellExec.cmd_exec(self, "rm -rf /var/run/nginx-cache/*") |
||||
|
else: |
||||
|
Log.error(self, "Unable to clean FastCGI cache") |
||||
|
|
||||
|
@expose(hide=True) |
||||
|
def clean_opcache(self): |
||||
|
"""This function clears opcache""" |
||||
|
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.error(self, "Unable to clean OpCache") |
||||
|
|
||||
|
|
||||
|
def load(app): |
||||
|
# register the plugin class.. this only happens if the plugin is enabled |
||||
|
handler.register(EECleanController) |
||||
|
# register a hook (function) to run after arguments are parsed. |
||||
|
hook.register('post_argument_parsing', clean_plugin_hook) |
@ -0,0 +1,503 @@ |
|||||
|
"""Debug Plugin for EasyEngine""" |
||||
|
|
||||
|
from cement.core.controller import CementBaseController, expose |
||||
|
from cement.core import handler, hook |
||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.mysql import EEMysql |
||||
|
from ee.core.services import EEService |
||||
|
from ee.core.logging import Log |
||||
|
from ee.cli.plugins.site_functions import logwatch |
||||
|
from ee.core.variables import EEVariables |
||||
|
import os |
||||
|
import configparser |
||||
|
import glob |
||||
|
import signal |
||||
|
|
||||
|
|
||||
|
def debug_plugin_hook(app): |
||||
|
# do something with the ``app`` object here. |
||||
|
pass |
||||
|
|
||||
|
|
||||
|
class EEDebugController(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')), |
||||
|
(['--nginx'], |
||||
|
dict(help='Debug Nginx', action='store_true')), |
||||
|
(['--php'], |
||||
|
dict(help='Debug PHP', action='store_true')), |
||||
|
(['--fpm'], |
||||
|
dict(help='Debug FastCGI', action='store_true')), |
||||
|
(['--mysql'], |
||||
|
dict(help='Debug MySQL', action='store_true')), |
||||
|
(['--wp'], |
||||
|
dict(help='Debug WordPress sites', action='store_true')), |
||||
|
(['--rewrite'], |
||||
|
dict(help='Debug Nginx rewrite rules', action='store_true')), |
||||
|
(['-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)) |
||||
|
] |
||||
|
|
||||
|
@expose(hide=True) |
||||
|
def debug_nginx(self): |
||||
|
"""Start/Stop Nginx debug""" |
||||
|
# start global debug |
||||
|
if self.start 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'] |
||||
|
for ip_addr in debug_address: |
||||
|
if not ("debug_connection "+ip_addr in open('/etc/nginx/' |
||||
|
'nginx.conf').read()): |
||||
|
Log.info(self, "Setting up Nginx debug connection" |
||||
|
" for "+ip_addr) |
||||
|
EEShellExec.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 not self.start and not self.app.pargs.site_name: |
||||
|
if "debug_connection " in open('/etc/nginx/nginx.conf').read(): |
||||
|
Log.info(self, "Disabling Nginx debug connections") |
||||
|
EEShellExec.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.start 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 EEShellExec.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)) |
||||
|
EEShellExec.cmd_exec(self, "sed -i \"s/error.log;/" |
||||
|
"error.log " |
||||
|
"debug;/\" {0}".format(config_path)) |
||||
|
self.trigger_nginx = True |
||||
|
|
||||
|
else: |
||||
|
Log.info(self, "Debug for site allready enabled") |
||||
|
|
||||
|
self.msg = self.msg + ['{0}{1}/logs/error.log' |
||||
|
.format(EEVariables.ee_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 not self.start 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 EEShellExec.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)) |
||||
|
EEShellExec.cmd_exec(self, "sed -i \"s/error.log debug;/" |
||||
|
"error.log;/\" {0}" |
||||
|
.format(config_path)) |
||||
|
self.trigger_nginx = True |
||||
|
|
||||
|
else: |
||||
|
|
||||
|
Log.info(self, "Debug for site allready 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.start: |
||||
|
if not (EEShellExec.cmd_exec(self, "sed -n \"/upstream php" |
||||
|
"{/,/}/p \" /etc/nginx/" |
||||
|
"conf.d/upstream.conf " |
||||
|
"| grep 9001")): |
||||
|
Log.info(self, "Enabling PHP debug") |
||||
|
data = dict(php="9001", debug="9001") |
||||
|
Log.info(self, 'Writting the Nginx debug configration to file ' |
||||
|
'/etc/nginx/conf.d/upstream.conf ') |
||||
|
ee_nginx = open('/etc/nginx/conf.d/upstream.conf', 'w') |
||||
|
self.app.render((data), 'upstream.mustache', out=ee_nginx) |
||||
|
ee_nginx.close() |
||||
|
self.trigger_php = True |
||||
|
self.trigger_nginx = True |
||||
|
else: |
||||
|
Log.info(self, "PHP debug is allready enabled") |
||||
|
|
||||
|
self.msg = self.msg + ['/var/log/php5/slow.log'] |
||||
|
|
||||
|
# PHP global debug stop |
||||
|
else: |
||||
|
if EEShellExec.cmd_exec(self, "sed -n \"/upstream php {/,/}/p\" " |
||||
|
"/etc/nginx/conf.d/upstream.conf " |
||||
|
"| grep 9001"): |
||||
|
Log.info(self, "Disabling PHP debug") |
||||
|
data = dict(php="9000", debug="9001") |
||||
|
Log.debug(self, 'Writting the Nginx debug configration to file' |
||||
|
' /etc/nginx/conf.d/upstream.conf ') |
||||
|
ee_nginx = open('/etc/nginx/conf.d/upstream.conf', 'w') |
||||
|
self.app.render((data), 'upstream.mustache', out=ee_nginx) |
||||
|
ee_nginx.close() |
||||
|
self.trigger_php = True |
||||
|
self.trigger_nginx = True |
||||
|
else: |
||||
|
Log.info(self, "PHP debug is allready disabled") |
||||
|
|
||||
|
@expose(hide=True) |
||||
|
def debug_fpm(self): |
||||
|
"""Start/Stop PHP5-FPM debug""" |
||||
|
# PHP5-FPM start global debug |
||||
|
if self.start: |
||||
|
if not EEShellExec.cmd_exec(self, "grep \"log_level = debug\" " |
||||
|
"/etc/php5/fpm/php-fpm.conf"): |
||||
|
Log.info(self, "Setting up PHP5-FPM log_level = debug") |
||||
|
config = configparser.ConfigParser() |
||||
|
config.read('/etc/php5/fpm/php-fpm.conf') |
||||
|
config.remove_option('global', 'include') |
||||
|
config['global']['log_level'] = 'debug' |
||||
|
config['global']['include'] = '/etc/php5/fpm/pool.d/*.conf' |
||||
|
with open('/etc/php5/fpm/php-fpm.conf', 'w') as configfile: |
||||
|
Log.debug(self, "Writting php5-FPM configuration into " |
||||
|
"/etc/php5/fpm/php-fpm.conf") |
||||
|
config.write(configfile) |
||||
|
self.trigger_php = True |
||||
|
else: |
||||
|
Log.info(self, "PHP5-FPM log_level = debug already setup") |
||||
|
|
||||
|
self.msg = self.msg + ['/var/log/php5/fpm.log'] |
||||
|
|
||||
|
# PHP5-FPM stop global debug |
||||
|
else: |
||||
|
if EEShellExec.cmd_exec(self, "grep \"log_level = debug\" " |
||||
|
"/etc/php5/fpm/php-fpm.conf"): |
||||
|
Log.info(self, "Disabling PHP5-FPM log_level = debug") |
||||
|
config = configparser.ConfigParser() |
||||
|
config.read('/etc/php5/fpm/php-fpm.conf') |
||||
|
config.remove_option('global', 'include') |
||||
|
config['global']['log_level'] = 'notice' |
||||
|
config['global']['include'] = '/etc/php5/fpm/pool.d/*.conf' |
||||
|
with open('/etc/php5/fpm/php-fpm.conf', 'w') as configfile: |
||||
|
Log.debug(self, "writting php5 configuration into " |
||||
|
"/etc/php5/fpm/php-fpm.conf") |
||||
|
config.write(configfile) |
||||
|
|
||||
|
self.trigger_php = True |
||||
|
else: |
||||
|
Log.info(self, "PHP5-FPM log_level = debug already disabled") |
||||
|
|
||||
|
@expose(hide=True) |
||||
|
def debug_mysql(self): |
||||
|
"""Start/Stop MySQL debug""" |
||||
|
# MySQL start global debug |
||||
|
if self.start: |
||||
|
if not EEShellExec.cmd_exec(self, "mysql -e \"show variables like" |
||||
|
" \'slow_query_log\';\" | " |
||||
|
"grep ON"): |
||||
|
Log.info(self, "Setting up MySQL slow log") |
||||
|
EEMysql.execute(self, "set global slow_query_log = " |
||||
|
"\'ON\';") |
||||
|
EEMysql.execute(self, "set global slow_query_log_file = " |
||||
|
"\'/var/log/mysql/mysql-slow.log\';") |
||||
|
EEMysql.execute(self, "set global long_query_time = 2;") |
||||
|
EEMysql.execute(self, "set global log_queries_not_using" |
||||
|
"_indexes = \'ON\';") |
||||
|
if self.app.pargs.interval: |
||||
|
try: |
||||
|
cron_time = int(self.app.pargs.interval) |
||||
|
except Exception as e: |
||||
|
cron_time = 5 |
||||
|
EEShellExec.cmd_exec(self, "/bin/bash -c \"crontab -l 2> " |
||||
|
"/dev/null | {{ cat; echo -e" |
||||
|
" \\\"#EasyEngine start MySQL slow" |
||||
|
" log \\n*/{0} * * * * " |
||||
|
"/usr/local/sbin/ee import-slow-log\\" |
||||
|
"n#EasyEngine end MySQL slow log\\\";" |
||||
|
" }} | crontab -\"".format(cron_time)) |
||||
|
else: |
||||
|
Log.info(self, "MySQL slow log is allready enabled") |
||||
|
|
||||
|
self.msg = self.msg + ['/var/log/mysql/mysql-slow.log'] |
||||
|
|
||||
|
# MySQL stop global debug |
||||
|
else: |
||||
|
if EEShellExec.cmd_exec(self, "mysql -e \"show variables like \'" |
||||
|
"slow_query_log\';\" | grep ON"): |
||||
|
Log.info(self, "Disabling MySQL slow log") |
||||
|
EEMysql.execute(self, "set global slow_query_log = \'OFF\';") |
||||
|
EEMysql.execute(self, "set global slow_query_log_file = \'" |
||||
|
"/var/log/mysql/mysql-slow.log\';") |
||||
|
EEMysql.execute(self, "set global long_query_time = 10;") |
||||
|
EEMysql.execute(self, "set global log_queries_not_using_index" |
||||
|
"es = \'OFF\';") |
||||
|
EEShellExec.cmd_exec(self, "crontab -l | sed \'/#EasyEngine " |
||||
|
"start/,/#EasyEngine 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.start and self.app.pargs.site_name: |
||||
|
wp_config = ("{0}{1}/wp-config.php" |
||||
|
.format(EEVariables.ee_webroot, |
||||
|
self.app.pargs.site_name)) |
||||
|
webroot = "{0}{1}".format(EEVariables.ee_webroot, |
||||
|
self.app.pargs.site_name) |
||||
|
if os.path.isfile(wp_config): |
||||
|
if not EEShellExec.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), |
||||
|
'a').close() |
||||
|
EEShellExec.cmd_exec(self, "chown {1}: {0}/htdocs/wp-" |
||||
|
"content/debug.log" |
||||
|
"".format(webroot, |
||||
|
EEVariables.ee_php_user)) |
||||
|
EEShellExec.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)) |
||||
|
EEShellExec.cmd_exec(self, "cd {0}/htdocs/ && wp" |
||||
|
" plugin --allow-root install " |
||||
|
"developer".format(webroot)) |
||||
|
EEShellExec.cmd_exec(self, "chown -R {1}: {0}/htdocs/" |
||||
|
"wp-content/plugins" |
||||
|
.format(webroot, |
||||
|
EEVariables.ee_php_user)) |
||||
|
else: |
||||
|
Log.info(self, "WordPress debug log already enabled") |
||||
|
|
||||
|
self.msg = self.msg + ['{0}{1}/htdocs/wp-content' |
||||
|
'/debug.log' |
||||
|
.format(EEVariables.ee_webroot, |
||||
|
self.app.pargs.site_name)] |
||||
|
|
||||
|
else: |
||||
|
Log.info(self, "{0} domain not valid" |
||||
|
.format(self.app.pargs.site_name)) |
||||
|
|
||||
|
elif not self.start and self.app.pargs.site_name: |
||||
|
wp_config = ("{0}{1}/wp-config.php" |
||||
|
.format(EEVariables.ee_webroot, |
||||
|
self.app.pargs.site_name)) |
||||
|
webroot = "{0}{1}".format(EEVariables.ee_webroot, |
||||
|
self.app.pargs.site_name) |
||||
|
if os.path.isfile(wp_config): |
||||
|
if EEShellExec.cmd_exec(self, "grep \"\'WP_DEBUG\'\" {0} | " |
||||
|
"grep true".format(wp_config)): |
||||
|
Log.info(self, "Disabling WordPress debug") |
||||
|
EEShellExec.cmd_exec(self, "sed -i \"s/define(\'WP_DEBUG\'" |
||||
|
", true);/define(\'WP_DEBUG\', " |
||||
|
"false);/\" {0}".format(wp_config)) |
||||
|
EEShellExec.cmd_exec(self, "sed -i \"/define(\'" |
||||
|
"WP_DEBUG_DISPLAY\', false);/d\" {0}" |
||||
|
.format(wp_config)) |
||||
|
EEShellExec.cmd_exec(self, "sed -i \"/define(\'" |
||||
|
"WP_DEBUG_LOG\', true);/d\" {0}" |
||||
|
.format(wp_config)) |
||||
|
EEShellExec.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, "{0} domain not valid" |
||||
|
.format(self.app.pargs.site_name)) |
||||
|
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.start and not self.app.pargs.site_name: |
||||
|
if not EEShellExec.cmd_exec(self, "grep \"rewrite_log on;\" " |
||||
|
"/etc/nginx/nginx.conf"): |
||||
|
Log.info(self, "Setting up Nginx rewrite logs") |
||||
|
EEShellExec.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 not self.start and not self.app.pargs.site_name: |
||||
|
if EEShellExec.cmd_exec(self, "grep \"rewrite_log on;\" " |
||||
|
"/etc/nginx/nginx.conf"): |
||||
|
Log.info(self, "Disabling Nginx rewrite logs") |
||||
|
EEShellExec.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.start and self.app.pargs.site_name: |
||||
|
config_path = ("/etc/nginx/sites-available/{0}" |
||||
|
.format(self.app.pargs.site_name)) |
||||
|
if not EEShellExec.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)) |
||||
|
EEShellExec.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} allready setup" |
||||
|
.format(self.app.pargs.site_name)) |
||||
|
|
||||
|
if ('{0}{1}/logs/error.log'.format(EEVariables.ee_webroot, |
||||
|
self.app.pargs.site_name) |
||||
|
not in self.msg): |
||||
|
self.msg = self.msg + ['{0}{1}/logs/error.log' |
||||
|
.format(EEVariables.ee_webroot, |
||||
|
self.app.pargs.site_name)] |
||||
|
|
||||
|
# Stop Nginx rewrite for site |
||||
|
elif not self.start and self.app.pargs.site_name: |
||||
|
config_path = ("/etc/nginx/sites-available/{0}" |
||||
|
.format(self.app.pargs.site_name)) |
||||
|
if EEShellExec.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)) |
||||
|
EEShellExec.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} allready " |
||||
|
" 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.debug_nginx() |
||||
|
if self.app.pargs.php: |
||||
|
self.debug_php() |
||||
|
if self.app.pargs.fpm: |
||||
|
self.debug_fpm() |
||||
|
if self.app.pargs.mysql: |
||||
|
self.debug_mysql() |
||||
|
if self.app.pargs.wp: |
||||
|
self.debug_wp() |
||||
|
if self.app.pargs.rewrite: |
||||
|
self.debug_rewrite() |
||||
|
|
||||
|
# Reload Nginx |
||||
|
if self.trigger_nginx: |
||||
|
EEService.reload_service(self, 'nginx') |
||||
|
|
||||
|
# Reload PHP |
||||
|
if self.trigger_php: |
||||
|
EEService.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 self.app.pargs.stop: |
||||
|
self.start = False |
||||
|
|
||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.php) |
||||
|
and (not self.app.pargs.fpm) and (not self.app.pargs.mysql) |
||||
|
and (not self.app.pargs.wp) and (not self.app.pargs.rewrite) |
||||
|
and (not self.app.pargs.site_name)): |
||||
|
self.debug_nginx() |
||||
|
self.debug_php() |
||||
|
self.debug_fpm() |
||||
|
self.debug_mysql() |
||||
|
self.debug_rewrite() |
||||
|
|
||||
|
if ((not self.app.pargs.nginx) and (not self.app.pargs.php) |
||||
|
and (not self.app.pargs.fpm) 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.debug_nginx() |
||||
|
self.debug_wp() |
||||
|
self.debug_rewrite() |
||||
|
|
||||
|
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.mysql: |
||||
|
self.debug_mysql() |
||||
|
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: |
||||
|
EEService.reload_service(self, 'nginx') |
||||
|
# Reload PHP |
||||
|
if self.trigger_php: |
||||
|
EEService.reload_service(self, 'php5-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) |
||||
|
|
||||
|
|
||||
|
def load(app): |
||||
|
# register the plugin class.. this only happens if the plugin is enabled |
||||
|
handler.register(EEDebugController) |
||||
|
# register a hook (function) to run after arguments are parsed. |
||||
|
hook.register('post_argument_parsing', debug_plugin_hook) |
@ -0,0 +1,70 @@ |
|||||
|
from cement.core.controller import CementBaseController, expose |
||||
|
from cement.core import handler, hook |
||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.logging import Log |
||||
|
from ee.core.variables import EEVariables |
||||
|
import os |
||||
|
|
||||
|
|
||||
|
def import_slow_log_plugin_hook(app): |
||||
|
pass |
||||
|
|
||||
|
|
||||
|
class EEImportslowlogController(CementBaseController): |
||||
|
class Meta: |
||||
|
label = 'import_slow_log' |
||||
|
stacked_on = 'base' |
||||
|
stacked_type = 'nested' |
||||
|
description = 'Import MySQL slow log to Anemometer database' |
||||
|
|
||||
|
@expose(hide=True) |
||||
|
def default(self): |
||||
|
"""Default function for import slow log""" |
||||
|
if os.path.isdir("{0}22222/htdocs/db/anemometer" |
||||
|
.format(EEVariables.ee_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(EEVariables.ee_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(EEVariables.ee_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(EEVariables.ee_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 |
||||
|
EEShellExec.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)) |
||||
|
else: |
||||
|
Log.error(self, "Unable to find MySQL slow log file") |
||||
|
else: |
||||
|
Log.error(self, "Anemometer is not installed") |
||||
|
|
||||
|
|
||||
|
def load(app): |
||||
|
# register the plugin class.. this only happens if the plugin is enabled |
||||
|
handler.register(EEImportslowlogController) |
||||
|
|
||||
|
# register a hook (function) to run after arguments are parsed. |
||||
|
hook.register('post_argument_parsing', import_slow_log_plugin_hook) |
@ -0,0 +1,202 @@ |
|||||
|
"""EEInfo Plugin for EasyEngine.""" |
||||
|
|
||||
|
from cement.core.controller import CementBaseController, expose |
||||
|
from cement.core import handler, hook |
||||
|
from pynginxconfig import NginxConfig |
||||
|
from ee.core.aptget import EEAptGet |
||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.logging import Log |
||||
|
import os |
||||
|
import configparser |
||||
|
|
||||
|
|
||||
|
def info_plugin_hook(app): |
||||
|
# do something with the ``app`` object here. |
||||
|
pass |
||||
|
|
||||
|
|
||||
|
class EEInfoController(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')), |
||||
|
(['--nginx'], |
||||
|
dict(help='Get Nginx configuration information', |
||||
|
action='store_true')), |
||||
|
] |
||||
|
|
||||
|
@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] |
||||
|
if os.path.isfile('/etc/nginx/conf.d/ee-nginx.conf'): |
||||
|
nc.loadf('/etc/nginx/conf.d/ee-nginx.conf') |
||||
|
fastcgi_read_timeout = nc.get('fastcgi_read_timeout')[1] |
||||
|
client_max_body_size = nc.get('client_max_body_size')[1] |
||||
|
else: |
||||
|
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("php -v | head -n1 | cut -d' ' -f2 |" |
||||
|
" cut -d'+' -f1 | tr -d '\n'").read |
||||
|
config = configparser.ConfigParser() |
||||
|
config.read('/etc/php5/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/php5/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/php5/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): |
||||
|
self.app.pargs.nginx = True |
||||
|
self.app.pargs.php = True |
||||
|
self.app.pargs.mysql = True |
||||
|
|
||||
|
if self.app.pargs.nginx: |
||||
|
if EEAptGet.is_installed(self, 'nginx-common'): |
||||
|
self.info_nginx() |
||||
|
else: |
||||
|
Log.error(self, "Nginx is not installed") |
||||
|
|
||||
|
if self.app.pargs.php: |
||||
|
if EEAptGet.is_installed(self, 'php5-fpm'): |
||||
|
self.info_php() |
||||
|
else: |
||||
|
Log.error(self, "PHP5 is not installed") |
||||
|
|
||||
|
if self.app.pargs.mysql: |
||||
|
if EEShellExec.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(EEInfoController) |
||||
|
|
||||
|
# register a hook (function) to run after arguments are parsed. |
||||
|
hook.register('post_argument_parsing', info_plugin_hook) |
@ -0,0 +1,132 @@ |
|||||
|
from cement.core.controller import CementBaseController, expose |
||||
|
from cement.core import handler, hook |
||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.variables import EEVariables |
||||
|
from ee.core.logging import Log |
||||
|
import string |
||||
|
import random |
||||
|
import sys |
||||
|
import hashlib |
||||
|
import getpass |
||||
|
|
||||
|
|
||||
|
def secure_plugin_hook(app): |
||||
|
# do something with the ``app`` object here. |
||||
|
pass |
||||
|
|
||||
|
|
||||
|
class EESecureController(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))] |
||||
|
|
||||
|
@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(EEVariables.ee_user)) |
||||
|
self.app.pargs.user_input = username |
||||
|
if username == "": |
||||
|
self.app.pargs.user_input = EEVariables.ee_user |
||||
|
if not self.app.pargs.user_pass: |
||||
|
password = input("Provide HTTP authentication " |
||||
|
"password [{0}] :".format(passwd)) |
||||
|
self.app.pargs.user_pass = password |
||||
|
if password == "": |
||||
|
self.app.pargs.user_pass = passwd |
||||
|
EEShellExec.cmd_exec(self, "printf \"{username}:" |
||||
|
"$(openssl passwd -crypt " |
||||
|
"{password} 2> /dev/null)\n\"" |
||||
|
"> /etc/nginx/htpasswd-ee 2>/dev/null" |
||||
|
.format(username=self.app.pargs.user_input, |
||||
|
password=self.app.pargs.user_pass)) |
||||
|
Log.info(self, "Successfully changed HTTP authentication" |
||||
|
" username to : {username}" |
||||
|
.format(username=self.app.pargs.user_input)) |
||||
|
Log.info(self, "Successfully changed HTTP authentication" |
||||
|
" password to : {password}" |
||||
|
.format(password=self.app.pargs.user_pass)) |
||||
|
|
||||
|
@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 valid port number ") |
||||
|
self.app.pargs.user_input = input("EasyEngine " |
||||
|
"admin port [22222]:") |
||||
|
if not self.app.pargs.user_input: |
||||
|
port = input("EasyEngine 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("EasyEngine admin port [22222]:") |
||||
|
self.app.pargs.user_input = port |
||||
|
if EEVariables.ee_platform_distro == 'Ubuntu': |
||||
|
EEShellExec.cmd_exec(self, "sed -i \"s/listen.*/listen " |
||||
|
"{port} default_server ssl spdy;/\" " |
||||
|
"/etc/nginx/sites-available/22222.conf" |
||||
|
.format(port=self.app.pargs.user_input)) |
||||
|
if EEVariables.ee_platform_distro == 'debian': |
||||
|
EEShellExec.cmd_exec(self, "sed -i \"s/listen.*/listen " |
||||
|
"{port} default_server ssl;/\" " |
||||
|
"/etc/nginx/sites-available/22222.conf" |
||||
|
.format(port=self.app.pargs.user_input)) |
||||
|
Log.info(self, "Successfully port changed {port}" |
||||
|
.format(port=self.app.pargs.user_input)) |
||||
|
|
||||
|
@expose(hide=True) |
||||
|
def secure_ip(self): |
||||
|
"""This function Secures IP""" |
||||
|
# TODO:remaining with ee.conf updation in file |
||||
|
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()): |
||||
|
EEShellExec.cmd_exec(self, "sed -i " |
||||
|
"\"/deny/i allow {whitelist_adre}\;\"" |
||||
|
" /etc/nginx/common/acl.conf" |
||||
|
.format(whitelist_adre=ip_addr)) |
||||
|
Log.info(self, "Successfully added IP address in acl.conf file") |
||||
|
|
||||
|
|
||||
|
def load(app): |
||||
|
# register the plugin class.. this only happens if the plugin is enabled |
||||
|
handler.register(EESecureController) |
||||
|
# register a hook (function) to run after arguments are parsed. |
||||
|
hook.register('post_argument_parsing', secure_plugin_hook) |
File diff suppressed because it is too large
@ -0,0 +1,538 @@ |
|||||
|
from ee.cli.plugins.stack import EEStackController |
||||
|
from ee.core.fileutils import EEFileUtils |
||||
|
from ee.core.mysql import EEMysql |
||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.variables import EEVariables |
||||
|
from ee.core.aptget import EEAptGet |
||||
|
from ee.core.logging import Log |
||||
|
import os |
||||
|
import random |
||||
|
import string |
||||
|
import sys |
||||
|
import getpass |
||||
|
import glob |
||||
|
import re |
||||
|
|
||||
|
|
||||
|
def setupdomain(self, data): |
||||
|
|
||||
|
ee_domain_name = data['site_name'] |
||||
|
ee_site_webroot = data['webroot'] |
||||
|
Log.info(self, "Setting up NGINX configuration \t", end='') |
||||
|
# write nginx config for file |
||||
|
try: |
||||
|
ee_site_nginx_conf = open('/etc/nginx/sites-available/{0}' |
||||
|
.format(ee_domain_name), 'w') |
||||
|
|
||||
|
self.app.render((data), 'virtualconf.mustache', |
||||
|
out=ee_site_nginx_conf) |
||||
|
ee_site_nginx_conf.close() |
||||
|
except IOError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "\nUnable to create NGINX configuration") |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "\nUnable to create NGINX configuration") |
||||
|
Log.info(self, "[" + Log.ENDC + "Done" + Log.OKBLUE + "]") |
||||
|
|
||||
|
# create symbolic link for |
||||
|
EEFileUtils.create_symlink(self, ['/etc/nginx/sites-available/{0}' |
||||
|
.format(ee_domain_name), |
||||
|
'/etc/nginx/sites-enabled/{0}' |
||||
|
.format(ee_domain_name)]) |
||||
|
|
||||
|
# Creating htdocs & logs directory |
||||
|
Log.info(self, "Setting up webroot \t\t", end='') |
||||
|
try: |
||||
|
if not os.path.exists('{0}/htdocs'.format(ee_site_webroot)): |
||||
|
os.makedirs('{0}/htdocs'.format(ee_site_webroot)) |
||||
|
if not os.path.exists('{0}/logs'.format(ee_site_webroot)): |
||||
|
os.makedirs('{0}/logs'.format(ee_site_webroot)) |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "\nUnable to setup webroot") |
||||
|
|
||||
|
EEFileUtils.create_symlink(self, ['/var/log/nginx/{0}.access.log' |
||||
|
.format(ee_domain_name), |
||||
|
'{0}/logs/access.log' |
||||
|
.format(ee_site_webroot)]) |
||||
|
EEFileUtils.create_symlink(self, ['/var/log/nginx/{0}.error.log' |
||||
|
.format(ee_domain_name), |
||||
|
'{0}/logs/error.log' |
||||
|
.format(ee_site_webroot)]) |
||||
|
Log.info(self, "[" + Log.ENDC + "Done" + Log.OKBLUE + "]") |
||||
|
|
||||
|
|
||||
|
def setupdatabase(self, data): |
||||
|
ee_domain_name = data['site_name'] |
||||
|
ee_random = (''.join(random.sample(string.ascii_uppercase + |
||||
|
string.ascii_lowercase + string.digits, 15))) |
||||
|
ee_replace_dot = ee_domain_name.replace('.', '_') |
||||
|
prompt_dbname = self.app.config.get('mysql', 'db-name') |
||||
|
prompt_dbuser = self.app.config.get('mysql', 'db-user') |
||||
|
ee_mysql_grant_host = self.app.config.get('mysql', 'grant-host') |
||||
|
ee_db_name = '' |
||||
|
ee_db_username = '' |
||||
|
ee_db_password = '' |
||||
|
|
||||
|
if prompt_dbname == 'True' or prompt_dbname == 'true': |
||||
|
try: |
||||
|
ee_db_name = input('Enter the MySQL database name [{0}]: ' |
||||
|
.format(ee_replace_dot)) |
||||
|
except EOFError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to input database name") |
||||
|
|
||||
|
if not ee_db_name: |
||||
|
ee_db_name = ee_replace_dot |
||||
|
|
||||
|
if prompt_dbuser == 'True' or prompt_dbuser == 'true': |
||||
|
try: |
||||
|
ee_db_username = input('Enter the MySQL database user name [{0}]: ' |
||||
|
.format(ee_replace_dot)) |
||||
|
ee_db_password = getpass.getpass(prompt='Enter the MySQL database' |
||||
|
' password [{0}]: ' |
||||
|
.format(ee_random)) |
||||
|
except EOFError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to input database credentials") |
||||
|
|
||||
|
if not ee_db_username: |
||||
|
ee_db_username = ee_replace_dot |
||||
|
if not ee_db_password: |
||||
|
ee_db_password = ee_random |
||||
|
|
||||
|
if len(ee_db_username) > 16: |
||||
|
Log.debug(self, 'Autofix MySQL username (ERROR 1470 (HY000)),' |
||||
|
' please wait') |
||||
|
ee_random10 = (''.join(random.sample(string.ascii_uppercase + |
||||
|
string.ascii_lowercase + string.digits, 10))) |
||||
|
ee_db_username = (ee_db_name[0:6] + ee_random10) |
||||
|
# create MySQL database |
||||
|
Log.info(self, "Setting up database\t\t", end='') |
||||
|
Log.debug(self, "Creating databse {0}".format(ee_db_name)) |
||||
|
EEMysql.execute(self, "create database {0}" |
||||
|
.format(ee_db_name)) |
||||
|
|
||||
|
# Create MySQL User |
||||
|
Log.debug(self, "Creating user {0}".format(ee_db_username)) |
||||
|
EEMysql.execute(self, |
||||
|
"create user {0}@{1} identified by '{2}'" |
||||
|
.format(ee_db_username, ee_mysql_grant_host, |
||||
|
ee_db_password)) |
||||
|
|
||||
|
# Grant permission |
||||
|
Log.debug(self, "Setting up user privileges") |
||||
|
EEMysql.execute(self, |
||||
|
"grant all privileges on {0}.* to {1}@{2}" |
||||
|
.format(ee_db_name, ee_db_username, ee_mysql_grant_host)) |
||||
|
Log.info(self, "[" + Log.ENDC + "Done" + Log.OKBLUE + "]") |
||||
|
|
||||
|
data['ee_db_name'] = ee_db_name |
||||
|
data['ee_db_user'] = ee_db_username |
||||
|
data['ee_db_pass'] = ee_db_password |
||||
|
data['ee_db_host'] = EEVariables.ee_mysql_host |
||||
|
return(data) |
||||
|
|
||||
|
|
||||
|
def setupwordpress(self, data): |
||||
|
ee_domain_name = data['site_name'] |
||||
|
ee_site_webroot = data['webroot'] |
||||
|
prompt_wpprefix = self.app.config.get('wordpress', 'prefix') |
||||
|
ee_wp_user = self.app.config.get('wordpress', 'user') |
||||
|
ee_wp_pass = self.app.config.get('wordpress', 'password') |
||||
|
ee_wp_email = self.app.config.get('wordpress', 'email') |
||||
|
# Random characters |
||||
|
ee_random = (''.join(random.sample(string.ascii_uppercase + |
||||
|
string.ascii_lowercase + string.digits, 15))) |
||||
|
ee_wp_prefix = '' |
||||
|
# ee_wp_user = '' |
||||
|
# ee_wp_pass = '' |
||||
|
|
||||
|
Log.info(self, "Downloading Wordpress \t\t", end='') |
||||
|
EEFileUtils.chdir(self, '{0}/htdocs/'.format(ee_site_webroot)) |
||||
|
EEShellExec.cmd_exec(self, "wp --allow-root core download") |
||||
|
Log.info(self, "[" + Log.ENDC + "Done" + Log.OKBLUE + "]") |
||||
|
|
||||
|
if not (data['ee_db_name'] and data['ee_db_user'] and data['ee_db_pass']): |
||||
|
data = setupdatabase(self, data) |
||||
|
if prompt_wpprefix == 'True' or prompt_wpprefix == 'true': |
||||
|
try: |
||||
|
ee_wp_prefix = input('Enter the WordPress table prefix [wp_]: ') |
||||
|
while not re.match('^[A-Za-z0-9_]*$', ee_wp_prefix): |
||||
|
Log.warn(self, "table prefix can only " |
||||
|
"contain numbers, letters, and underscores") |
||||
|
ee_wp_prefix = input('Enter the WordPress table prefix [wp_]: ' |
||||
|
) |
||||
|
except EOFError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to input table prefix") |
||||
|
|
||||
|
if not ee_wp_prefix: |
||||
|
ee_wp_prefix = 'wp_' |
||||
|
|
||||
|
# Modify wp-config.php & move outside the webroot |
||||
|
|
||||
|
EEFileUtils.chdir(self, '{0}/htdocs/'.format(ee_site_webroot)) |
||||
|
Log.debug(self, "Setting up wp-config file") |
||||
|
if not data['multisite']: |
||||
|
Log.debug(self, "Generating wp-config for WordPress Single site") |
||||
|
Log.debug(self, "bash -c \"php /usr/bin/wp --allow-root " |
||||
|
+ "core config " |
||||
|
+ "--dbname={0} --dbprefix={1} --dbuser={2} " |
||||
|
.format(data['ee_db_name'], ee_wp_prefix, |
||||
|
data['ee_db_user']) |
||||
|
+ "--dbpass= " |
||||
|
"--extra-php<<PHP \n {1}\nPHP\"" |
||||
|
.format(data['ee_db_pass'], |
||||
|
"\n\ndefine(\'WP_DEBUG\', false);")) |
||||
|
EEShellExec.cmd_exec(self, "bash -c \"php /usr/bin/wp --allow-root " |
||||
|
+ "core config " |
||||
|
+ "--dbname={0} --dbprefix={1} --dbuser={2} " |
||||
|
.format(data['ee_db_name'], ee_wp_prefix, |
||||
|
data['ee_db_user']) |
||||
|
+ "--dbpass={0} " |
||||
|
"--extra-php<<PHP \n {1}\nPHP\"" |
||||
|
.format(data['ee_db_pass'], |
||||
|
"\n\ndefine(\'WP_DEBUG\', false);"), |
||||
|
log=False |
||||
|
) |
||||
|
else: |
||||
|
Log.debug(self, "Generating wp-config for WordPress multisite") |
||||
|
Log.debug(self, "bash -c \"php /usr/bin/wp --allow-root " |
||||
|
+ "core config " |
||||
|
+ "--dbname={0} --dbprefix={1} " |
||||
|
.format(data['ee_db_name'], ee_wp_prefix) |
||||
|
+ "--dbuser={0} --dbpass= " |
||||
|
"--extra-php<<PHP \n {2} {3} {4}\nPHP\"" |
||||
|
.format(data['ee_db_user'], data['ee_db_pass'], |
||||
|
"\ndefine(\'WP_ALLOW_MULTISITE\', " |
||||
|
"true);", |
||||
|
"\ndefine(\'WPMU_ACCEL_REDIRECT\'," |
||||
|
" true);", |
||||
|
"\n\ndefine(\'WP_DEBUG\', false);")) |
||||
|
EEShellExec.cmd_exec(self, "bash -c \"php /usr/bin/wp --allow-root " |
||||
|
+ "core config " |
||||
|
+ "--dbname={0} --dbprefix={1} " |
||||
|
.format(data['ee_db_name'], ee_wp_prefix) |
||||
|
+ "--dbuser={0} --dbpass={1} " |
||||
|
"--extra-php<<PHP \n {2} {3} {4}\nPHP\"" |
||||
|
.format(data['ee_db_user'], data['ee_db_pass'], |
||||
|
"\ndefine(\'WP_ALLOW_MULTISITE\', " |
||||
|
"true);", |
||||
|
"\ndefine(\'WPMU_ACCEL_REDIRECT\'," |
||||
|
" true);", |
||||
|
"\n\ndefine(\'WP_DEBUG\', false);"), |
||||
|
log=False |
||||
|
) |
||||
|
EEFileUtils.mvfile(self, os.getcwd()+'/wp-config.php', |
||||
|
os.path.abspath(os.path.join(os.getcwd(), os.pardir))) |
||||
|
|
||||
|
if not ee_wp_user: |
||||
|
ee_wp_user = EEVariables.ee_user |
||||
|
while not ee_wp_user: |
||||
|
Log.warn(self, "Username can have only alphanumeric" |
||||
|
"characters, spaces, underscores, hyphens," |
||||
|
"periods and the @ symbol.") |
||||
|
try: |
||||
|
ee_wp_user = input('Enter WordPress username: ') |
||||
|
except EOFError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to input WordPress user name") |
||||
|
|
||||
|
if not ee_wp_pass: |
||||
|
ee_wp_pass = ee_random |
||||
|
|
||||
|
if not ee_wp_email: |
||||
|
ee_wp_email = EEVariables.ee_email |
||||
|
while not ee_wp_email: |
||||
|
try: |
||||
|
ee_wp_email = input('Enter WordPress email: ') |
||||
|
except EOFError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to input WordPress user email") |
||||
|
|
||||
|
Log.debug(self, "Setting up WordPress tables") |
||||
|
|
||||
|
if not data['multisite']: |
||||
|
Log.debug(self, "Creating tables for WordPress Single site") |
||||
|
Log.debug(self, "php /usr/bin/wp --allow-root core install " |
||||
|
"--url={0} --title={0} --admin_name={1} " |
||||
|
.format(data['www_domain'], ee_wp_user) |
||||
|
+ "--admin_password= --admin_email={1}" |
||||
|
.format(ee_wp_pass, ee_wp_email)) |
||||
|
EEShellExec.cmd_exec(self, "php /usr/bin/wp --allow-root core install " |
||||
|
"--url={0} --title={0} --admin_name={1} " |
||||
|
.format(data['www_domain'], ee_wp_user) |
||||
|
+ "--admin_password={0} --admin_email={1}" |
||||
|
.format(ee_wp_pass, ee_wp_email), |
||||
|
errormsg="Unable to setup WordPress Tables", |
||||
|
log=False) |
||||
|
else: |
||||
|
Log.debug(self, "Creating tables for WordPress multisite") |
||||
|
Log.debug(self, "php /usr/bin/wp --allow-root " |
||||
|
"core multisite-install " |
||||
|
"--url={0} --title={0} --admin_name={1} " |
||||
|
.format(data['www_domain'], ee_wp_user) |
||||
|
+ "--admin_password= --admin_email={1} " |
||||
|
"{subdomains}" |
||||
|
.format(ee_wp_pass, ee_wp_email, |
||||
|
subdomains='--subdomains' |
||||
|
if not data['wpsubdir'] else '')) |
||||
|
EEShellExec.cmd_exec(self, "php /usr/bin/wp --allow-root " |
||||
|
"core multisite-install " |
||||
|
"--url={0} --title={0} --admin_name={1} " |
||||
|
.format(data['www_domain'], ee_wp_user) |
||||
|
+ "--admin_password={0} --admin_email={1} " |
||||
|
"{subdomains}" |
||||
|
.format(ee_wp_pass, ee_wp_email, |
||||
|
subdomains='--subdomains' |
||||
|
if not data['wpsubdir'] else ''), |
||||
|
errormsg="Unable to setup WordPress Tables") |
||||
|
|
||||
|
Log.debug(self, "Updating WordPress permalink") |
||||
|
EEShellExec.cmd_exec(self, " php /usr/bin/wp --allow-root " |
||||
|
"rewrite structure " |
||||
|
"/%year%/%monthnum%/%day%/%postname%/", |
||||
|
errormsg="Unable to Update WordPress permalink") |
||||
|
|
||||
|
"""Install nginx-helper plugin """ |
||||
|
installwp_plugin(self, 'nginx-helper', data) |
||||
|
|
||||
|
"""Install Wp Super Cache""" |
||||
|
if data['wpsc']: |
||||
|
installwp_plugin(self, 'wp-super-cache', data) |
||||
|
|
||||
|
"""Install W3 Total Cache""" |
||||
|
if data['w3tc'] or data['wpfc']: |
||||
|
installwp_plugin(self, 'w3-total-cache', data) |
||||
|
|
||||
|
wp_creds = dict(wp_user=ee_wp_user, wp_pass=ee_wp_pass, |
||||
|
wp_email=ee_wp_email) |
||||
|
|
||||
|
return(wp_creds) |
||||
|
|
||||
|
|
||||
|
def setupwordpressnetwork(self, data): |
||||
|
ee_site_webroot = data['webroot'] |
||||
|
EEFileUtils.chdir(self, '{0}/htdocs/'.format(ee_site_webroot)) |
||||
|
Log.info(self, "Setting up WordPress Network \t", end='') |
||||
|
EEShellExec.cmd_exec(self, 'wp --allow-root core multisite-convert' |
||||
|
' --title={0} {subdomains}' |
||||
|
.format(data['www_domain'], subdomains='--subdomains' |
||||
|
if not data['wpsubdir'] else '')) |
||||
|
Log.info(self, "[" + Log.ENDC + "Done" + Log.OKBLUE + "]") |
||||
|
|
||||
|
|
||||
|
def installwp_plugin(self, plugin_name, data): |
||||
|
ee_site_webroot = data['webroot'] |
||||
|
Log.debug(self, "Installing plugin {0}".format(plugin_name)) |
||||
|
EEFileUtils.chdir(self, '{0}/htdocs/'.format(ee_site_webroot)) |
||||
|
EEShellExec.cmd_exec(self, "php /usr/bin/wp plugin --allow-root install " |
||||
|
"{0}".format(plugin_name), |
||||
|
errormsg="Unable to Install plugin {0}" |
||||
|
.format(plugin_name)) |
||||
|
|
||||
|
EEShellExec.cmd_exec(self, "php /usr/bin/wp plugin --allow-root activate " |
||||
|
"{0} {na}" |
||||
|
.format(plugin_name, |
||||
|
na='--network' if data['multisite'] else ''), |
||||
|
errormsg="Unable to Activate plugin {0}" |
||||
|
.format(plugin_name)) |
||||
|
|
||||
|
|
||||
|
def uninstallwp_plugin(self, plugin_name, data): |
||||
|
ee_site_webroot = data['webroot'] |
||||
|
Log.debug(self, "Uninstalling plugin {0}".format(plugin_name)) |
||||
|
EEFileUtils.chdir(self, '{0}/htdocs/'.format(ee_site_webroot)) |
||||
|
EEShellExec.cmd_exec(self, "php /usr/bin/wp plugin --allow-root uninstall " |
||||
|
"{0}".format(plugin_name), |
||||
|
errormsg="Unable to UnInstall plugin {0}" |
||||
|
.format(plugin_name)) |
||||
|
|
||||
|
|
||||
|
def setwebrootpermissions(self, webroot): |
||||
|
Log.debug(self, "Setting up permissions") |
||||
|
EEFileUtils.chown(self, webroot, EEVariables.ee_php_user, |
||||
|
EEVariables.ee_php_user, recursive=True) |
||||
|
|
||||
|
|
||||
|
def sitebackup(self, data): |
||||
|
ee_site_webroot = data['webroot'] |
||||
|
backup_path = ee_site_webroot + '/backup/{0}'.format(EEVariables.ee_date) |
||||
|
if not EEFileUtils.isexist(self, backup_path): |
||||
|
EEFileUtils.mkdir(self, backup_path) |
||||
|
Log.info(self, "Backup location : {0}".format(backup_path)) |
||||
|
EEFileUtils.copyfile(self, '/etc/nginx/sites-available/{0}' |
||||
|
.format(data['site_name']), backup_path) |
||||
|
|
||||
|
if data['currsitetype'] in ['html', 'php', 'mysql']: |
||||
|
Log.info(self, "Backing up Webroot \t\t", end='') |
||||
|
EEFileUtils.mvfile(self, ee_site_webroot + '/htdocs', backup_path) |
||||
|
Log.info(self, "[" + Log.ENDC + "Done" + Log.OKBLUE + "]") |
||||
|
|
||||
|
configfiles = glob.glob(ee_site_webroot + '/*-config.php') |
||||
|
|
||||
|
if configfiles and EEFileUtils.isexist(self, configfiles[0]): |
||||
|
ee_db_name = (EEFileUtils.grep(self, configfiles[0], |
||||
|
'DB_NAME').split(',')[1] |
||||
|
.split(')')[0].strip().replace('\'', '')) |
||||
|
Log.info(self, 'Backing up database \t\t', end='') |
||||
|
EEShellExec.cmd_exec(self, "mysqldump {0} > {1}/{0}.sql" |
||||
|
.format(ee_db_name, backup_path), |
||||
|
errormsg="\nFailed: Backup Database") |
||||
|
Log.info(self, "[" + Log.ENDC + "Done" + Log.OKBLUE + "]") |
||||
|
# move wp-config.php/ee-config.php to backup |
||||
|
if data['currsitetype'] in ['mysql']: |
||||
|
EEFileUtils.mvfile(self, configfiles[0], backup_path) |
||||
|
else: |
||||
|
EEFileUtils.copyfile(self, configfiles[0], backup_path) |
||||
|
|
||||
|
|
||||
|
def site_package_check(self, stype): |
||||
|
apt_packages = [] |
||||
|
packages = [] |
||||
|
stack = EEStackController() |
||||
|
stack.app = self.app |
||||
|
if stype in ['html', 'php', 'mysql', 'wp', 'wpsubdir', 'wpsubdomain']: |
||||
|
Log.debug(self, "Setting apt_packages variable for Nginx") |
||||
|
if not EEAptGet.is_installed(self, 'nginx-common'): |
||||
|
apt_packages = apt_packages + EEVariables.ee_nginx |
||||
|
|
||||
|
if stype in ['php', 'mysql', 'wp', 'wpsubdir', 'wpsubdomain']: |
||||
|
Log.debug(self, "Setting apt_packages variable for PHP") |
||||
|
if not EEAptGet.is_installed(self, 'php5-fpm'): |
||||
|
apt_packages = apt_packages + EEVariables.ee_php |
||||
|
|
||||
|
if stype in ['mysql', 'wp', 'wpsubdir', 'wpsubdomain']: |
||||
|
Log.debug(self, "Setting apt_packages variable for MySQL") |
||||
|
if not EEShellExec.cmd_exec(self, "mysqladmin ping"): |
||||
|
apt_packages = apt_packages + EEVariables.ee_mysql |
||||
|
|
||||
|
if stype in ['php', 'mysql', 'wp', 'wpsubdir', 'wpsubdomain']: |
||||
|
Log.debug(self, "Setting apt_packages variable for Postfix") |
||||
|
if not EEAptGet.is_installed(self, 'postfix'): |
||||
|
apt_packages = apt_packages + EEVariables.ee_postfix |
||||
|
|
||||
|
if stype in ['wp', 'wpsubdir', 'wpsubdomain']: |
||||
|
Log.debug(self, "Setting packages variable for WP-CLI") |
||||
|
if not EEShellExec.cmd_exec(self, "which wp"): |
||||
|
packages = packages + [["https://github.com/wp-cli/wp-cli/" |
||||
|
"releases/download/v0.17.1/" |
||||
|
"wp-cli.phar", "/usr/bin/wp", |
||||
|
"WP-CLI"]] |
||||
|
return(stack.install(apt_packages=apt_packages, packages=packages, |
||||
|
disp_msg=False)) |
||||
|
|
||||
|
|
||||
|
def updatewpuserpassword(self, ee_domain, ee_site_webroot): |
||||
|
|
||||
|
ee_wp_user = '' |
||||
|
ee_wp_pass = '' |
||||
|
EEFileUtils.chdir(self, '{0}/htdocs/'.format(ee_site_webroot)) |
||||
|
|
||||
|
# Check if ee_domain is wordpress install |
||||
|
is_wp = EEShellExec.cmd_exec(self, "wp --allow-root core" |
||||
|
" version", |
||||
|
errormsg="{0} : Unable to check if wp install" |
||||
|
.format(ee_domain)) |
||||
|
|
||||
|
# Exit if ee_domain is not wordpress install |
||||
|
if not is_wp: |
||||
|
Log.error(self, "{0} does not seem to be a WordPress site" |
||||
|
.format(ee_domain)) |
||||
|
|
||||
|
ee_wp_user = input("Provide WordPress user name [admin]: ") |
||||
|
if ee_wp_user == "?": |
||||
|
Log.info(self, "Fetching WordPress user list") |
||||
|
EEShellExec.cmd_exec(self, "wp --allow-root user list " |
||||
|
"--fields=user_login | grep -v user_login", |
||||
|
errormsg="Unable to Fetch users list") |
||||
|
|
||||
|
if not ee_wp_user: |
||||
|
ee_wp_user = 'admin' |
||||
|
|
||||
|
is_user_exist = EEShellExec.cmd_exec(self, "wp --allow-root user list " |
||||
|
"--fields=user_login | grep {0}$ " |
||||
|
.format(ee_wp_user)) |
||||
|
|
||||
|
if is_user_exist: |
||||
|
ee_wp_pass = input("Provide password for {0} user: " |
||||
|
.format(ee_wp_user)) |
||||
|
if len(ee_wp_pass) > 8: |
||||
|
EEShellExec.cmd_exec(self, "wp --allow-root user update {0}" |
||||
|
" --user_pass={1}" |
||||
|
.format(ee_wp_user, ee_wp_pass)) |
||||
|
Log.info(self, "Password updated successfully") |
||||
|
else: |
||||
|
Log.error(self, "Password Unchanged. Hint : Your password must be " |
||||
|
"8 characters long") |
||||
|
else: |
||||
|
Log.error(self, "Invalid WordPress user {0} for {1}." |
||||
|
.format(ee_wp_user, ee_domain)) |
||||
|
|
||||
|
|
||||
|
def display_cache_settings(self, data): |
||||
|
if data['wpsc']: |
||||
|
if data['multisite']: |
||||
|
Log.info(self, "Configure WPSC:" |
||||
|
"\t\thttp://{0}/wp-admin/network/settings.php?" |
||||
|
"page=wpsupercache" |
||||
|
.format(data['site_name'])) |
||||
|
else: |
||||
|
Log.info(self, "Configure WPSC:" |
||||
|
"\t\thttp://{0}/wp-admin/options-general.php?" |
||||
|
"page=wpsupercache" |
||||
|
.format(data['site_name'])) |
||||
|
|
||||
|
if data['wpfc']: |
||||
|
if data['multisite']: |
||||
|
Log.info(self, "Configure nginx-helper:" |
||||
|
"\thttp://{0}/wp-admin/network/settings.php?" |
||||
|
"page=nginx".format(data['site_name'])) |
||||
|
else: |
||||
|
Log.info(self, "Configure nginx-helper:" |
||||
|
"\thttp://{0}/wp-admin/options-general.php?" |
||||
|
"page=nginx".format(data['site_name'])) |
||||
|
|
||||
|
if data['wpfc'] or data['w3tc']: |
||||
|
if data['multisite']: |
||||
|
Log.info(self, "Configure W3TC:" |
||||
|
"\t\thttp://{0}/wp-admin/network/admin.php?" |
||||
|
"page=w3tc_general".format(data['site_name'])) |
||||
|
else: |
||||
|
Log.info(self, "Configure W3TC:" |
||||
|
"\t\thttp://{0}/wp-admin/admin.php?" |
||||
|
"page=w3tc_general".format(data['site_name'])) |
||||
|
|
||||
|
if data['wpfc']: |
||||
|
Log.info(self, "Page Cache:\t\tDisable") |
||||
|
elif data['w3tc']: |
||||
|
Log.info(self, "Page Cache:\t\tDisk Enhanced") |
||||
|
Log.info(self, "Database Cache:\t\tMemcached") |
||||
|
Log.info(self, "Object Cache:\t\tMemcached") |
||||
|
Log.info(self, "Browser Cache:\t\tDisable") |
||||
|
|
||||
|
|
||||
|
def logwatch(self, logfiles): |
||||
|
import zlib |
||||
|
import base64 |
||||
|
import time |
||||
|
from ee.core import logwatch |
||||
|
|
||||
|
def callback(filename, lines): |
||||
|
for line in lines: |
||||
|
if line.find(':::') == -1: |
||||
|
print(line) |
||||
|
else: |
||||
|
data = line.split(':::') |
||||
|
try: |
||||
|
print(data[0], data[1], |
||||
|
zlib.decompress(base64.decodestring(data[2]))) |
||||
|
except Exception as e: |
||||
|
Log.info(time.time(), |
||||
|
'caught exception rendering a new log line in %s' |
||||
|
% filename) |
||||
|
|
||||
|
l = logwatch.LogWatcher(logfiles, callback) |
||||
|
l.loop() |
@ -0,0 +1,96 @@ |
|||||
|
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 ee.core.logging import Log |
||||
|
from ee.core.database import db_session |
||||
|
from ee.core.models import SiteDB |
||||
|
import sys |
||||
|
|
||||
|
|
||||
|
def addNewSite(self, site, stype, cache, path, |
||||
|
enabled=True, ssl=False, fs='ext4', db='mysql'): |
||||
|
""" |
||||
|
Add New Site record information into ee database. |
||||
|
""" |
||||
|
try: |
||||
|
newRec = SiteDB(site, stype, cache, path, enabled, ssl, fs, db) |
||||
|
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='', |
||||
|
enabled=True, ssl=False, fs='', db=''): |
||||
|
"""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 ssl and q.is_ssl != ssl: |
||||
|
q.is_ssl = ssl |
||||
|
|
||||
|
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): |
||||
|
|
||||
|
try: |
||||
|
q = SiteDB.query.all() |
||||
|
return q |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to query database") |
File diff suppressed because it is too large
@ -0,0 +1,159 @@ |
|||||
|
from cement.core.controller import CementBaseController, expose |
||||
|
from cement.core import handler, hook |
||||
|
from ee.core.services import EEService |
||||
|
from ee.core.logging import Log |
||||
|
|
||||
|
|
||||
|
class EEStackStatusController(CementBaseController): |
||||
|
class Meta: |
||||
|
label = 'stack_services' |
||||
|
stacked_on = 'stack' |
||||
|
stacked_type = 'embedded' |
||||
|
description = 'Get status of stack' |
||||
|
arguments = [ |
||||
|
(['--memcache'], |
||||
|
dict(help='start/stop/restart memcache', action='store_true')), |
||||
|
(['--dovecot'], |
||||
|
dict(help='start/stop/restart dovecot', action='store_true')), |
||||
|
] |
||||
|
|
||||
|
@expose(help="Start stack services") |
||||
|
def start(self): |
||||
|
"""Start services""" |
||||
|
services = [] |
||||
|
if self.app.pargs.nginx: |
||||
|
Log.debug(self, "nginx service start") |
||||
|
services = services + ['nginx'] |
||||
|
elif self.app.pargs.php: |
||||
|
Log.debug(self, "php5-fpm service start") |
||||
|
services = services + ['php5-fpm'] |
||||
|
elif self.app.pargs.mysql: |
||||
|
Log.debug(self, "mysql service start") |
||||
|
services = services + ['mysql'] |
||||
|
elif self.app.pargs.postfix: |
||||
|
Log.debug(self, "postfix service start") |
||||
|
services = services + ['postfix'] |
||||
|
elif self.app.pargs.memcache: |
||||
|
Log.debug(self, "memcached service start") |
||||
|
services = services + ['memcached'] |
||||
|
elif self.app.pargs.dovecot: |
||||
|
Log.debug(self, "dovecot service start") |
||||
|
services = services + ['dovecot'] |
||||
|
else: |
||||
|
Log.debug(self, "nginx,php5-fpm,mysql,postfix services start") |
||||
|
services = services + ['nginx', 'php5-fpm', 'mysql', 'postfix'] |
||||
|
for service in services: |
||||
|
EEService.start_service(self, service) |
||||
|
|
||||
|
@expose(help="Stop stack services") |
||||
|
def stop(self): |
||||
|
"""Stop services""" |
||||
|
services = [] |
||||
|
if self.app.pargs.nginx: |
||||
|
Log.debug(self, "nginx service stop") |
||||
|
services = services + ['nginx'] |
||||
|
elif self.app.pargs.php: |
||||
|
Log.debug(self, "php5-fpm service stop") |
||||
|
services = services + ['php5-fpm'] |
||||
|
elif self.app.pargs.mysql: |
||||
|
Log.debug(self, "mysql service stop") |
||||
|
services = services + ['mysql'] |
||||
|
elif self.app.pargs.postfix: |
||||
|
Log.debug(self, "postfix service stop") |
||||
|
services = services + ['postfix'] |
||||
|
elif self.app.pargs.memcache: |
||||
|
Log.debug(self, "memcached service stop") |
||||
|
services = services + ['memcached'] |
||||
|
elif self.app.pargs.dovecot: |
||||
|
Log.debug(self, "dovecot service stop") |
||||
|
services = services + ['dovecot'] |
||||
|
else: |
||||
|
services = services + ['nginx', 'php5-fpm', 'mysql', 'postfix'] |
||||
|
Log.debug(self, "nginx,php5-fpm,mysql,postfix services stop") |
||||
|
for service in services: |
||||
|
EEService.stop_service(self, service) |
||||
|
|
||||
|
@expose(help="Restart stack services") |
||||
|
def restart(self): |
||||
|
"""Restart services""" |
||||
|
services = [] |
||||
|
if self.app.pargs.nginx: |
||||
|
Log.debug(self, "nginx service restart") |
||||
|
services = services + ['nginx'] |
||||
|
elif self.app.pargs.php: |
||||
|
Log.debug(self, "php5-fpm service restart") |
||||
|
services = services + ['php5-fpm'] |
||||
|
elif self.app.pargs.mysql: |
||||
|
Log.debug(self, "mysql service restart") |
||||
|
services = services + ['mysql'] |
||||
|
elif self.app.pargs.postfix: |
||||
|
Log.debug(self, "postfix service restart") |
||||
|
services = services + ['postfix'] |
||||
|
elif self.app.pargs.memcache: |
||||
|
Log.debug(self, "memcached service restart") |
||||
|
services = services + ['memcached'] |
||||
|
elif self.app.pargs.dovecot: |
||||
|
Log.debug(self, "dovecot service restart") |
||||
|
services = services + ['dovecot'] |
||||
|
else: |
||||
|
services = services + ['nginx', 'php5-fpm', 'mysql', 'postfix'] |
||||
|
for service in services: |
||||
|
Log.debug(self, "nginx,php5-fpm,mysql,postfix services restart") |
||||
|
EEService.restart_service(self, service) |
||||
|
|
||||
|
@expose(help="Get stack status") |
||||
|
def status(self): |
||||
|
"""Status of services""" |
||||
|
services = [] |
||||
|
if self.app.pargs.nginx: |
||||
|
Log.debug(self, "nginx service status") |
||||
|
services = services + ['nginx'] |
||||
|
elif self.app.pargs.php: |
||||
|
Log.debug(self, "php5-fpm service status") |
||||
|
services = services + ['php5-fpm'] |
||||
|
elif self.app.pargs.mysql: |
||||
|
Log.debug(self, "mysql service status") |
||||
|
services = services + ['mysql'] |
||||
|
elif self.app.pargs.postfix: |
||||
|
services = services + ['postfix'] |
||||
|
Log.debug(self, "postfix service status") |
||||
|
elif self.app.pargs.memcache: |
||||
|
Log.debug(self, "memcached service status") |
||||
|
services = services + ['memcached'] |
||||
|
elif self.app.pargs.dovecot: |
||||
|
Log.debug(self, "dovecot service status") |
||||
|
services = services + ['dovecot'] |
||||
|
else: |
||||
|
Log.debug(self, "nginx,php5-fpm,mysql,postfix services status") |
||||
|
services = services + ['nginx', 'php5-fpm', 'mysql', 'postfix'] |
||||
|
for service in services: |
||||
|
if EEService.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 self.app.pargs.nginx: |
||||
|
Log.debug(self, "nginx service reload") |
||||
|
services = services + ['nginx'] |
||||
|
elif self.app.pargs.php: |
||||
|
Log.debug(self, "php5-fpm service reload") |
||||
|
services = services + ['php5-fpm'] |
||||
|
elif self.app.pargs.mysql: |
||||
|
Log.debug(self, "mysql service reload") |
||||
|
services = services + ['mysql'] |
||||
|
elif self.app.pargs.postfix: |
||||
|
Log.debug(self, "postfix service reload") |
||||
|
services = services + ['postfix'] |
||||
|
elif self.app.pargs.memcache: |
||||
|
Log.debug(self, "memcached service reload") |
||||
|
services = services + ['memcached'] |
||||
|
elif self.app.pargs.dovecot: |
||||
|
Log.debug(self, "dovecot service reload") |
||||
|
services = services + ['dovecot'] |
||||
|
else: |
||||
|
services = services + ['nginx', 'php5-fpm', 'mysql', 'postfix'] |
||||
|
for service in services: |
||||
|
Log.debug(self, "nginx,php5-fpm,mysql,postfix services reload") |
||||
|
EEService.reload_service(self, service) |
@ -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 |
@ -0,0 +1,61 @@ |
|||||
|
# EasyEngine admin NGINX CONFIGURATION |
||||
|
|
||||
|
server { |
||||
|
|
||||
|
listen 22222 default_server ssl spdy; |
||||
|
|
||||
|
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; |
||||
|
|
||||
|
location / { |
||||
|
include common/acl.conf; |
||||
|
try_files $uri $uri/ /index.php?$args; |
||||
|
} |
||||
|
|
||||
|
location = /fpm/status/ {} |
||||
|
|
||||
|
location ~ /fpm/status/(.*) { |
||||
|
include fastcgi_params; |
||||
|
fastcgi_param SCRIPT_NAME /status; |
||||
|
fastcgi_pass $1; |
||||
|
} |
||||
|
|
||||
|
location ~ \.php$ { |
||||
|
include common/acl.conf; |
||||
|
try_files $uri =404; |
||||
|
include fastcgi_params; |
||||
|
fastcgi_pass php; |
||||
|
} |
||||
|
|
||||
|
# ViMbAdmin Rules |
||||
|
location = /vimbadmin/ { |
||||
|
return 301 $scheme://$host:22222/vimbadmin/public/; |
||||
|
} |
||||
|
|
||||
|
location ~* \.(js|css|jpg|gif|png)$ { |
||||
|
root {{webroot}}22222/htdocs/; |
||||
|
} |
||||
|
|
||||
|
location ~* /vimbadmin/public/(.*)/(.*) { |
||||
|
root {{webroot}}22222/htdocs/vimbadmin/public; |
||||
|
try_files $uri $uri/ /vimbadmin/public/index.php?$args; |
||||
|
} |
||||
|
|
||||
|
location ~* /vimbadmin/public/(.*) { |
||||
|
root {{webroot}}22222/htdocs/vimbadmin/public; |
||||
|
try_files $uri $uri/ /vimbadmin/public/index.php?$args; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
use strict; |
||||
|
$sa_spam_subject_tag = undef; |
||||
|
$spam_quarantine_to = undef; |
||||
|
$sa_tag_level_deflt = undef; |
||||
|
|
||||
|
# Prevent spams from automatically rejected by mail-server |
||||
|
$final_spam_destiny = D_PASS; |
||||
|
|
||||
|
# We need to provide list of domains for which filtering need to be done |
||||
|
@lookup_sql_dsn = ( |
||||
|
['DBI:mysql:database=vimbadmin;host={{host}};port=3306', |
||||
|
'vimbadmin', |
||||
|
'{{password}}']); |
||||
|
|
||||
|
$sql_select_policy = 'SELECT domain FROM domain WHERE CONCAT("@",domain) IN (%k)'; |
||||
|
|
||||
|
1; # ensure a defined return |
@ -0,0 +1,8 @@ |
|||||
|
# EasyEngine (ee) protect locations using |
||||
|
# HTTP authentication || IP address |
||||
|
satisfy any; |
||||
|
auth_basic "Restricted Area"; |
||||
|
auth_basic_user_file htpasswd-ee; |
||||
|
# Allowed IP Address List |
||||
|
allow 127.0.0.1; |
||||
|
deny all; |
@ -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' |
||||
|
), |
||||
|
); |
||||
|
|
||||
|
?> |
@ -0,0 +1,11 @@ |
|||||
|
passdb { |
||||
|
driver = sql |
||||
|
args = /etc/dovecot/dovecot-sql.conf.ext |
||||
|
} |
||||
|
userdb { |
||||
|
driver = prefetch |
||||
|
} |
||||
|
userdb { |
||||
|
driver = sql |
||||
|
args = /etc/dovecot/dovecot-sql.conf.ext |
||||
|
} |
@ -0,0 +1,2 @@ |
|||||
|
# Block IP Address |
||||
|
# deny 1.1.1.1; |
@ -0,0 +1,4 @@ |
|||||
|
require "fileinto"; |
||||
|
if header :contains "X-Spam-Flag" "YES" { |
||||
|
fileinto "Junk"; |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
driver = mysql |
||||
|
connect = host={{host}} user=vimbadmin password={{password}} dbname=vimbadmin |
||||
|
default_pass_scheme = MD5 |
||||
|
password_query = SELECT username as user, password as password, \ |
||||
|
homedir AS home, maildir AS mail, \ |
||||
|
concat('*:bytes=', quota) as quota_rule, uid, gid \ |
||||
|
FROM mailbox \ |
||||
|
WHERE username = '%Lu' AND active = '1' \ |
||||
|
AND ( access_restriction = 'ALL' OR LOCATE( access_restriction, '%Us' ) > 0 ) |
||||
|
user_query = SELECT homedir AS home, maildir AS mail, \ |
||||
|
concat('*:bytes=', quota) as quota_rule, uid, gid \ |
||||
|
FROM mailbox WHERE username = '%u' |
@ -0,0 +1,60 @@ |
|||||
|
protocols = imap pop3 lmtp sieve |
||||
|
|
||||
|
mail_location = maildir:/var/vmail/%d/%n |
||||
|
|
||||
|
disable_plaintext_auth = no |
||||
|
auth_mechanisms = plain login |
||||
|
#!include auth-system.conf.ext |
||||
|
!include auth-sql.conf.ext |
||||
|
|
||||
|
ssl_protocols = !SSLv2 !SSLv3 |
||||
|
|
||||
|
service lmtp { |
||||
|
unix_listener /var/spool/postfix/private/dovecot-lmtp { |
||||
|
mode = 0600 |
||||
|
user = postfix |
||||
|
group = postfix |
||||
|
} |
||||
|
} |
||||
|
service auth { |
||||
|
unix_listener /var/spool/postfix/private/auth { |
||||
|
mode = 0666 |
||||
|
user = postfix |
||||
|
group = postfix |
||||
|
} |
||||
|
unix_listener auth-userdb { |
||||
|
mode = 0600 |
||||
|
user = vmail |
||||
|
} |
||||
|
user = dovecot |
||||
|
} |
||||
|
service auth-worker { |
||||
|
user = vmail |
||||
|
} |
||||
|
|
||||
|
log_path = /var/log/dovecot.log |
||||
|
|
||||
|
mail_plugins = $mail_plugins autocreate |
||||
|
|
||||
|
plugin { |
||||
|
autocreate = Trash |
||||
|
autocreate2 = Junk |
||||
|
autocreate3 = Drafts |
||||
|
autocreate4 = Sent |
||||
|
autosubscribe = Trash |
||||
|
autosubscribe2 = Junk |
||||
|
autosubscribe3 = Drafts |
||||
|
autosubscribe4 = Sent |
||||
|
} |
||||
|
|
||||
|
protocol lmtp { |
||||
|
postmaster_address = {{email}} |
||||
|
mail_plugins = $mail_plugins sieve |
||||
|
} |
||||
|
|
||||
|
plugin { |
||||
|
sieve = ~/.dovecot.sieve |
||||
|
sieve_global_path = /var/lib/dovecot/sieve/default.sieve |
||||
|
sieve_global_dir = /var/lib/dovecot/sieve/ |
||||
|
sieve_dir = ~/sieve |
||||
|
} |
@ -0,0 +1,9 @@ |
|||||
|
# 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; |
@ -0,0 +1,9 @@ |
|||||
|
|
||||
|
MySQL ({{version}}) on {{host}}: |
||||
|
|
||||
|
port {{port}} |
||||
|
wait_timeout {{wait_timeout}} |
||||
|
interactive_timeout {{interactive_timeout}} |
||||
|
max_used_connections {{max_used_connections}} |
||||
|
datadir {{datadir}} |
||||
|
socket {{socket}} |
@ -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}} |
@ -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}} |
@ -0,0 +1,65 @@ |
|||||
|
# NGINX CONFIGURATION FOR COMMON LOCATION |
||||
|
# DO NOT MODIFY, ALL CHNAGES LOST AFTER UPDATE EasyEngine (ee) |
||||
|
# 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 ~ /\. { |
||||
|
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) |
||||
|
if ($request_uri ~* "^.+(readme|license)\.(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; |
||||
|
} |
||||
|
# EasyEngine (ee) 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; |
||||
|
} |
@ -0,0 +1,39 @@ |
|||||
|
## |
||||
|
# EasyEngine Settings |
||||
|
## |
||||
|
|
||||
|
server_tokens off; |
||||
|
reset_timedout_connection on; |
||||
|
add_header X-Powered-By "EasyEngine {{version}}"; |
||||
|
add_header rt-Fastcgi-Cache $upstream_cache_status; |
||||
|
|
||||
|
# 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:20m; |
||||
|
ssl_session_timeout 10m; |
||||
|
ssl_prefer_server_ciphers on; |
||||
|
ssl_ciphers HIGH:!aNULL:!MD5:!kEDH; |
||||
|
|
||||
|
# 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; |
||||
|
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; |
@ -0,0 +1,10 @@ |
|||||
|
# PHP NGINX CONFIGURATION |
||||
|
# DO NOT MODIFY, ALL CHNAGES LOST AFTER UPDATE EasyEngine (ee) |
||||
|
location / { |
||||
|
try_files $uri $uri/ /index.php?$args; |
||||
|
} |
||||
|
location ~ \.php$ { |
||||
|
try_files $uri =404; |
||||
|
include fastcgi_params; |
||||
|
fastcgi_pass php; |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
Information about {{domain}}: |
||||
|
|
||||
|
Nginx configuration {{type}} {{enable}} |
||||
|
access_log {{accesslog}} |
||||
|
error_log {{errorlog}} |
||||
|
Webroot {{webroot}} |
||||
|
{{#dbname}}DB_NAME {{dbname}}{{/dbname}} |
||||
|
{{#dbname}}DB_USER {{dbuser}}{{/dbname}} |
||||
|
{{#dbname}}DB_PASS {{dbpass}}{{/dbname}} |
||||
|
{{#tablepref}}table_prefix {{tableprefix}}{{/tablepref}} |
@ -0,0 +1,9 @@ |
|||||
|
# 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}}; |
||||
|
} |
@ -0,0 +1,662 @@ |
|||||
|
;; This file is licenesed Under GNU GENERAL PUBLIC LICENSE Version 3 |
||||
|
;; © Copyright 2011 - 2014 Open Source Solutions Limited, Dublin, Ireland. |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; ViMbAdmin :: Virtual Mailbox Admin |
||||
|
;; |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; IMPORTANT: Review and change all options in [user] |
||||
|
;; |
||||
|
;; ** This is for ViMbAdmin V3 and later ** |
||||
|
;; |
||||
|
;; See: https://github.com/opensolutions/ViMbAdmin/wiki/Configuration |
||||
|
|
||||
|
[user] |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; Installation Keys and Salts |
||||
|
; |
||||
|
; During installation, you will be prompted to enter strings here. This |
||||
|
; is to verify that you are in fact the person authorised to complete the |
||||
|
; installation as well as provide security for cookies and passwords. |
||||
|
|
||||
|
securitysalt = "{{salt}}" |
||||
|
resources.auth.oss.rememberme.salt = "{{salt}}" |
||||
|
defaults.mailbox.password_salt = "{{salt}}" |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; When installing for the first time, it may be useful to set the following |
||||
|
; to 1 BUT ensure you set it to zero again in a production system |
||||
|
|
||||
|
phpSettings.display_startup_errors = 0 |
||||
|
phpSettings.display_errors = 0 |
||||
|
resources.frontController.params.displayExceptions = 0 |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; You database and caching connection. |
||||
|
;; |
||||
|
|
||||
|
resources.doctrine2.connection.options.driver = 'mysqli' |
||||
|
resources.doctrine2.connection.options.dbname = 'vimbadmin' |
||||
|
resources.doctrine2.connection.options.user = 'vimbadmin' |
||||
|
resources.doctrine2.connection.options.password = '{{password}}' |
||||
|
resources.doctrine2.connection.options.host = '{{host}}' |
||||
|
resources.doctrine2.connection.options.charset = 'utf8' |
||||
|
|
||||
|
;; Doctrine2 requires Memcache for maximum efficency. Without Memcache |
||||
|
;; it can be highly inefficient and will slow page requests down. |
||||
|
;; |
||||
|
;; You are strongly advised to install memcache and comment ArrayCache |
||||
|
;; here and uncomment MemcacheCache. |
||||
|
;; |
||||
|
|
||||
|
resources.doctrine2cache.type = 'ArrayCache' |
||||
|
;resources.doctrine2cache.type = 'MemcacheCache' |
||||
|
;resources.doctrine2cache.memcache.servers.0.host = '127.0.0.1' |
||||
|
resources.doctrine2cache.namespace = 'ViMbAdmin3' |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; Default values used when creating domains |
||||
|
; |
||||
|
; See: https://github.com/opensolutions/ViMbAdmin/wiki/Configuration |
||||
|
; See: https://github.com/opensolutions/ViMbAdmin/wiki/Quotas |
||||
|
|
||||
|
defaults.domain.quota = 0 |
||||
|
defaults.domain.maxquota = 0 |
||||
|
defaults.domain.transport = "virtual" |
||||
|
defaults.domain.aliases = 0 |
||||
|
defaults.domain.mailboxes = 0 |
||||
|
|
||||
|
defaults.quota.multiplier = 'MB' |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; Use server side filtering to reduce pagination time on client side |
||||
|
;; Defaults to off / false |
||||
|
defaults.server_side.pagination.enable = false |
||||
|
defaults.server_side.pagination.min_search_str = 3 |
||||
|
defaults.server_side.pagination.max_result_cnt = 500 |
||||
|
|
||||
|
;; Separate configuration for domain list |
||||
|
defaults.server_side.pagination.domain.enable = false |
||||
|
defaults.server_side.pagination.domain.min_search_str = 3 |
||||
|
defaults.server_side.pagination.domain.max_result_cnt = 500 |
||||
|
|
||||
|
; The number of rows displayed in the tables |
||||
|
; must be one of these: 10, 25, 50, 100 |
||||
|
defaults.table.entries = 50 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; Options for the display of domain and mailbox sizes |
||||
|
;; |
||||
|
;; See: https://github.com/opensolutions/ViMbAdmin/wiki/Mailbox-Sizes |
||||
|
;; |
||||
|
;; Enable or disable display of sizes. Default: disabled |
||||
|
|
||||
|
defaults.list_size.disabled = true |
||||
|
|
||||
|
;; Maildir size units. By default: KB. One of B, KB, MB or GB. |
||||
|
defaults.list_size.multiplier = 'GB' |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; Default values for creating mailboxes |
||||
|
|
||||
|
; This sets the uid and gid columns in the mailbox table to the below values |
||||
|
defaults.mailbox.uid = 5000 |
||||
|
defaults.mailbox.gid = 5000 |
||||
|
|
||||
|
|
||||
|
; Set the homedir and maildir values in the mailbox table where the |
||||
|
; following substitutions apply: |
||||
|
; |
||||
|
; %d -> domain part of email address |
||||
|
; %u -> user part of email address |
||||
|
; $m -> full email address |
||||
|
; |
||||
|
; |
||||
|
; http://wiki2.dovecot.org/VirtualUsers/Home |
||||
|
|
||||
|
defaults.mailbox.maildir = "maildir:/var/vmail/%d/%u" |
||||
|
defaults.mailbox.homedir = "/var/vmail/" |
||||
|
|
||||
|
;minimum mailbox password length |
||||
|
defaults.mailbox.min_password_length = 8 |
||||
|
|
||||
|
; The password hashing function to use. Set to one of: |
||||
|
; |
||||
|
; "plain" - password stored as clear text |
||||
|
; "md5" - password hashed using MD5 without salt (PHP md5()) |
||||
|
; "md5.salted" - password hashed using MD5 with salt (see below) |
||||
|
; "sha1" - password hashed using sha1 without salt |
||||
|
; "sha1.salted" - password hashed using sha1 with salt defined below |
||||
|
; "crypt:XXX" - call the PHP crypt function (with random salt) where XXX is one of: md5, blowfish, sha256, sha512 |
||||
|
; "dovecot:XXX" - call the Dovecot password generator (see next option below) and use the |
||||
|
; scheme specified by XXX. To see available schemes, use 'dovecotpw -l' |
||||
|
; or 'doveadm pw -l' |
||||
|
|
||||
|
defaults.mailbox.password_scheme = "md5" |
||||
|
|
||||
|
; The path to (and initial option(s) if necessary) the Dovecot password generator. Typical |
||||
|
; values may be something like: |
||||
|
; |
||||
|
; "/usr/bin/doveadm pw" |
||||
|
; "/usr/bin/dovecotpw" |
||||
|
|
||||
|
defaults.mailbox.dovecot_pw_binary = "/usr/bin/doveadm pw" |
||||
|
|
||||
|
|
||||
|
|
||||
|
;; A "mailbox alias" will, for example add the following entry to |
||||
|
;; the alias table for a mailbox: name@example.com |
||||
|
;; |
||||
|
;; name@example.com -> name@example.com |
||||
|
;; |
||||
|
;; This is required for aliasing an entire domain. If in doubt, leave it enabled. |
||||
|
mailboxAliases = 1 |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; See: https://github.com/opensolutions/ViMbAdmin/wiki/Archiving-Mailboxes |
||||
|
|
||||
|
server_id = 1 |
||||
|
|
||||
|
;;Archive options |
||||
|
binary.path.chown_R = "/bin/chown -R" |
||||
|
binary.path.tar_cf = "/bin/tar -cf" |
||||
|
binary.path.tar_xf = "/bin/tar -xf" |
||||
|
binary.path.bzip2_q = "/bin/bzip2 -q" |
||||
|
binary.path.bunzip2_q = "/bin/bunzip2 -q" |
||||
|
binary.path.rm_rf = "/bin/rm -rf" |
||||
|
|
||||
|
archive.path = "/srv/archives" |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; Enable mailbox deletion on the file system |
||||
|
; |
||||
|
; See: https://github.com/opensolutions/ViMbAdmin/wiki/Deleting-Mailboxes |
||||
|
; |
||||
|
|
||||
|
mailbox_deletion_fs_enabled = false |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; Export Mailbox Settings |
||||
|
; |
||||
|
; See: https://github.com/opensolutions/ViMbAdmin/wiki/Export-Settings |
||||
|
; |
||||
|
defaults.export_settings.disabled = true |
||||
|
|
||||
|
|
||||
|
;; Export settings alowed subnets |
||||
|
defaults.export_settings.allowed_subnet[] = "10." |
||||
|
defaults.export_settings.allowed_subnet[] = "192.168." |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; Settings email default values. |
||||
|
;; |
||||
|
;; Substituions are as follows: |
||||
|
;; |
||||
|
;; %d -> domain part of email address |
||||
|
;; %u -> user part of email address |
||||
|
;; $m -> full email address |
||||
|
;; |
||||
|
;; See (and skin) the following file to see how the below are used: |
||||
|
;; |
||||
|
;; views/mailbox/email/settings.phtml |
||||
|
;; |
||||
|
|
||||
|
server.smtp.enabled = 1 |
||||
|
server.smtp.host = "mail.%d" |
||||
|
server.smtp.user = "%m" |
||||
|
server.smtp.port = "465" |
||||
|
server.smtp.crypt = "SSL" |
||||
|
|
||||
|
server.pop3.enabled = 1 |
||||
|
server.pop3.host = "gpo.%d" |
||||
|
server.pop3.user = "%m" |
||||
|
server.pop3.port = "995" |
||||
|
server.pop3.crypt = "SSL" |
||||
|
|
||||
|
server.imap.enabled = 1 |
||||
|
server.imap.host = "gpo.%d" |
||||
|
server.imap.user = "%m" |
||||
|
server.imap.port = "993" |
||||
|
server.imap.crypt = "SSL" |
||||
|
|
||||
|
server.webmail.enabled = 1 |
||||
|
server.webmail.host = "https://webmail.%d" |
||||
|
server.webmail.user = "%m" |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; Identity |
||||
|
|
||||
|
identity.orgname = "Example Limited" |
||||
|
identity.name = "Example Support Team" |
||||
|
identity.email = "support@example.com" |
||||
|
identity.autobot.name = "ViMbAdmin Autobot" |
||||
|
identity.autobot.email = "autobot@example.com" |
||||
|
identity.mailer.name = "ViMbAdmin Autobot" |
||||
|
identity.mailer.email = "do-not-reply@example.com" |
||||
|
|
||||
|
identity.sitename = "ViMbAdmin" |
||||
|
identity.siteurl = "https://www.example.com/vimbadmin/" |
||||
|
|
||||
|
|
||||
|
;; |
||||
|
;; All mail and correspondence will come from the following;; |
||||
|
|
||||
|
server.email.name = "ViMbAdmin Administrator" |
||||
|
server.email.address = "support@example.com" |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; Skinning |
||||
|
;; |
||||
|
;; You can skin ViMbAdmin pages if you wish. |
||||
|
;; |
||||
|
;; See: https://github.com/opensolutions/ViMbAdmin/wiki/Skinning |
||||
|
|
||||
|
; resources.smarty.skin = "myskin" |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; See: http://framework.zend.com/manual/en/zend.mail.smtp-authentication.html |
||||
|
;; |
||||
|
;; Ensure you have a working mail server configuration so the system can |
||||
|
;; send emails: |
||||
|
;; |
||||
|
resources.mailer.smtphost = "localhost" |
||||
|
;resources.mailer.username = "" |
||||
|
;resources.mailer.password = "" |
||||
|
;resources.mailer.auth = "" |
||||
|
;resources.mailer.ssl = "" |
||||
|
;resources.mailer.port = "25" |
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; Local filesystem logging. |
||||
|
;; |
||||
|
;; We log various things to var/log/YYYY/MM/ if you enable the logger here. |
||||
|
;; |
||||
|
;; It is useful to use the email logger to be alerted of serious errors. |
||||
|
;; |
||||
|
|
||||
|
ondemand_resources.logger.enabled = 1 |
||||
|
|
||||
|
;ondemand_resources.logger.writers.email.from = "admin@example.com" |
||||
|
;ondemand_resources.logger.writers.email.to = "admin@example.com" |
||||
|
;ondemand_resources.logger.writers.email.prefix = "ViMbAdmin_Error" |
||||
|
;ondemand_resources.logger.writers.email.level = 3 |
||||
|
|
||||
|
ondemand_resources.logger.writers.stream.level = 7 |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; ViMbAdmin performs a version check on administrator login and alerts the |
||||
|
;; user if there is a newer version available. |
||||
|
;; |
||||
|
;; This can be disabled by setting the below to 1 |
||||
|
;; |
||||
|
|
||||
|
skipVersionCheck = 0 |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; ViMbAdmin 'pings' the developers as part of the set up process to let |
||||
|
;; them know there is a new installation. |
||||
|
;; |
||||
|
;; All we are interested in is knowing whether people are using the software |
||||
|
;; or not and whether continued support and development is worth the time |
||||
|
;; and effort. |
||||
|
;; |
||||
|
;; Unless you're very shy, PLEASE LET US KNOW YOU'RE USING IT! |
||||
|
;; |
||||
|
;; This can be disabled by setting the below to 1 |
||||
|
;; |
||||
|
|
||||
|
skipInstallPingback = 0 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; Allow admins to dictate whether a user can use BOTH, IMAP ONLY, |
||||
|
; POP3 ONLY when creating mailboxes. |
||||
|
; |
||||
|
; Must be supported by your POP3/IMAP server. |
||||
|
; |
||||
|
; See https://github.com/opensolutions/ViMbAdmin/wiki/POP3-IMAP-Access-Permissions |
||||
|
; for documentation. |
||||
|
; |
||||
|
; This is handled via a plugin |
||||
|
; |
||||
|
|
||||
|
vimbadmin_plugins.AccessPermissions.disabled = false |
||||
|
|
||||
|
; specify the options which should be allowed for access restrictions |
||||
|
vimbadmin_plugins.AccessPermissions.type.SMTP = "SMTP" |
||||
|
vimbadmin_plugins.AccessPermissions.type.IMAP = "IMAP" |
||||
|
vimbadmin_plugins.AccessPermissions.type.POP3 = "POP3" |
||||
|
vimbadmin_plugins.AccessPermissions.type.SIEVE = "SIEVE" |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;; |
||||
|
;; Proceed onwards with caution. |
||||
|
;; |
||||
|
;; The above [user] params are the may ones of consequence. |
||||
|
;; |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; Allows to add additional information. |
||||
|
; |
||||
|
; This is handled via a plugin |
||||
|
; |
||||
|
|
||||
|
vimbadmin_plugins.AccessPermissions.disabled = false |
||||
|
vimbadmin_plugins.Jabber.disabled = true |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled = true |
||||
|
vimbadmin_plugins.SharedMailbox.disabled = true |
||||
|
vimbadmin_plugins.SOGo.disabled = true |
||||
|
|
||||
|
|
||||
|
vimbadmin_plugins.AdditionalInfo.disabled = true |
||||
|
vimbadmin_plugins.Addressbook.disabled = true |
||||
|
vimbadmin_plugins.Calendar.disabled = true |
||||
|
vimbadmin_plugins.RoundCube.disabled = true |
||||
|
|
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;;;; Disabling directory entry subform element |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
|
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.JpegPhoto = true |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Mail = true |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.PreferredLanguage = true |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Secretary = true |
||||
|
|
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.PersonalTitle = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.GivenName = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Sn = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.DisplayName = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Initials = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.BusinesCategory = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.EmployeeType = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Title = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.DepartmentNumber = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Ou = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.RoomNumber = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.O = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.CarLicense = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.EmployeeNumber = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.HomePhone = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.TelephoneNumber = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Mobile = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Pager = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.FacsimileTelephoneNumber = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.HomePostalAddress = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.LabeledUri = false |
||||
|
vimbadmin_plugins.DirectoryEntry.disabled_elements.Manager = false |
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
;;; Mailbox AdditionalInfo plugin elements |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
|
||||
|
|
||||
|
;;Additional text messages for plugin. |
||||
|
AdditionalInfo.mailbox.formPreBlurb = "<p><strong>NB:</strong> Do not edit the following. It is sync'd on a nightly basis ..." |
||||
|
|
||||
|
; First Name |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.id.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.id.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.id.options.label = "LDAP Id" |
||||
|
|
||||
|
; First Name |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.first_name.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.first_name.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.first_name.options.label = "First Name" |
||||
|
|
||||
|
; Last Name |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.second_name.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.second_name.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.second_name.options.label = "Last Name" |
||||
|
|
||||
|
; Grade |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.grade.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.grade.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.grade.options.label = "Grade" |
||||
|
|
||||
|
; Grade Id |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.grade_id.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.grade_id.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.grade_id.options.label = "Grade Id" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.grade_id.options.validators.digits[] = 'Digits' |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.grade_id.options.validators.digits[] = true |
||||
|
|
||||
|
; Department |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.department.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.department.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.department.options.label = "Department" |
||||
|
|
||||
|
; Department Id |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.department_id.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.department_id.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.department_id.options.label = "Department Id" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.department_id.options.validators.digits[] = 'Digits' |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.department_id.options.validators.digits[] = true |
||||
|
|
||||
|
; Section |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.section.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.section.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.section.options.label = "Section" |
||||
|
|
||||
|
; Extension Number |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.label = "Extension Number" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.validators.digits[] = 'Digits' |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.validators.digits[] = true |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.validators.length[] = 'StringLength' |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.validators.length[] = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.validators.length.range[] = 4 |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.validators.length.range[] = 4 |
||||
|
;;to disable autocomplete functionality |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.ext_no.options.autocomplete = 'off' |
||||
|
|
||||
|
; Direct Dial |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.d_dial.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.d_dial.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.d_dial.options.label = "Direct Dial" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.d_dial.options.autocomplete = 'off' |
||||
|
|
||||
|
; Mobile |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.mobile.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.mobile.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.mobile.options.label = "Mobile" |
||||
|
vimbadmin_plugins.AdditionalInfo.elements.mobile.options.autocomplete = 'off' |
||||
|
|
||||
|
;;;;;;; |
||||
|
;; Aliases additional information |
||||
|
;; |
||||
|
; First Name |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.name.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.name.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.name.options.label = "Name" |
||||
|
|
||||
|
; Extension Number |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.label = "Extension Number" |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.validators.digits[] = 'Digits' |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.validators.digits[] = true |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.validators.length[] = 'StringLength' |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.validators.length[] = false |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.validators.length.range[] = 4 |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.validators.length.range[] = 4 |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.ext_no.options.autocomplete = 'off' |
||||
|
|
||||
|
; Direct Dial |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.d_dial.type = "Zend_Form_Element_Text" |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.d_dial.options.required = false |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.d_dial.options.label = "Direct Dial" |
||||
|
vimbadmin_plugins.AdditionalInfo.alias.elements.d_dial.options.autocomplete = 'off' |
||||
|
|
||||
|
|
||||
|
[production : user] |
||||
|
|
||||
|
includePaths.library = APPLICATION_PATH "/../library" |
||||
|
includePaths.osslibrary = APPLICATION_PATH "/../vendor/opensolutions/oss-framework/src/" |
||||
|
|
||||
|
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" |
||||
|
bootstrap.class = "Bootstrap" |
||||
|
appnamespace = "ViMbAdmin" |
||||
|
|
||||
|
temporary_directory = APPLICATION_PATH "/../var/tmp" |
||||
|
|
||||
|
pluginPaths.OSS_Resource = APPLICATION_PATH "/../vendor/opensolutions/oss-framework/src/OSS/Resource" |
||||
|
pluginPaths.ViMbAdmin_Resource = APPLICATION_PATH "/../library/ViMbAdmin/Resource" |
||||
|
|
||||
|
mini_js = 1 |
||||
|
mini_css = 1 |
||||
|
|
||||
|
alias_autocomplete_min_length = 2 |
||||
|
|
||||
|
|
||||
|
|
||||
|
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" |
||||
|
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" |
||||
|
resources.modules[] = |
||||
|
|
||||
|
|
||||
|
; doctrine2 |
||||
|
resources.doctrine2.models_path = APPLICATION_PATH |
||||
|
resources.doctrine2.proxies_path = APPLICATION_PATH "/Proxies" |
||||
|
resources.doctrine2.repositories_path = APPLICATION_PATH |
||||
|
resources.doctrine2.xml_schema_path = APPLICATION_PATH "/../doctrine2/xml" |
||||
|
resources.doctrine2.autogen_proxies = 0 |
||||
|
resources.doctrine2.logger = 1 |
||||
|
resources.doctrine2.models_namespace = "Entities" |
||||
|
resources.doctrine2.proxies_namespace = "Proxies" |
||||
|
resources.doctrine2.repositories_namespace = "Repositories" |
||||
|
|
||||
|
|
||||
|
resources.doctrine2cache.autoload_method = "composer" |
||||
|
;resources.doctrine2cache.type = 'ArrayCache' |
||||
|
;resources.doctrine2cache.type = 'MemcacheCache' |
||||
|
;resources.doctrine2cache.memcache.servers.0.host = '127.0.0.1' |
||||
|
;resources.doctrine2cache.memcache.servers.0.port = '11211' |
||||
|
;resources.doctrine2cache.memcache.servers.0.persistent = false |
||||
|
;resources.doctrine2cache.memcache.servers.0.weight = 1 |
||||
|
;resources.doctrine2cache.memcache.servers.0.timeout = 1 |
||||
|
;resources.doctrine2cache.memcache.servers.0.retry_int = 15 |
||||
|
|
||||
|
; resources.doctrine2cache.memcache.servers.1.host = 'xxx' |
||||
|
; resources.doctrine2cache.memcache.servers.2.host = 'yyy' |
||||
|
|
||||
|
resources.namespace.checkip = 0 |
||||
|
|
||||
|
resources.auth.enabled = 1 |
||||
|
resources.auth.oss.adapter = "OSS_Auth_Doctrine2Adapter" |
||||
|
resources.auth.oss.pwhash = "bcrypt" |
||||
|
resources.auth.oss.hash_cost = 9 |
||||
|
resources.auth.oss.entity = "\\Entities\\Admin" |
||||
|
resources.auth.oss.disabled.lost-username = 1 |
||||
|
resources.auth.oss.disabled.lost-password = 0 |
||||
|
|
||||
|
resources.auth.oss.rememberme.enabled = 1 |
||||
|
resources.auth.oss.rememberme.timeout = 2592000 |
||||
|
resources.auth.oss.rememberme.secure = true |
||||
|
|
||||
|
resources.auth.oss.lost_password.use_captcha = true |
||||
|
|
||||
|
resources.session.save_path = APPLICATION_PATH "/../var/session" |
||||
|
resources.session.use_only_cookies = true |
||||
|
resources.session.remember_me_seconds = 3600 |
||||
|
resources.session.name = 'VIMBADMIN3' |
||||
|
|
||||
|
ondemand_resources.logger.writers.stream.path = APPLICATION_PATH "/../var/log" |
||||
|
ondemand_resources.logger.writers.stream.owner = {{php_user}} |
||||
|
ondemand_resources.logger.writers.stream.group = {{php_user}} |
||||
|
ondemand_resources.logger.writers.stream.mode = single |
||||
|
ondemand_resources.logger.writers.stream.logname = vimbadmin.log |
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; Smarty View |
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
|
||||
|
resources.smarty.enabled = 1 |
||||
|
resources.smarty.templates = APPLICATION_PATH "/views" |
||||
|
; resources.smarty.skin = "myskin" |
||||
|
resources.smarty.compiled = APPLICATION_PATH "/../var/templates_c" |
||||
|
resources.smarty.cache = APPLICATION_PATH "/../var/cache" |
||||
|
resources.smarty.config = APPLICATION_PATH "/configs/smarty" |
||||
|
resources.smarty.plugins[] = APPLICATION_PATH "/../library/ViMbAdmin/Smarty/functions" |
||||
|
resources.smarty.plugins[] = APPLICATION_PATH "/../vendor/opensolutions/oss-framework/src/OSS/Smarty/functions" |
||||
|
resources.smarty.plugins[] = APPLICATION_PATH "/../vendor/smarty/smarty/libs/plugins" |
||||
|
resources.smarty.plugins[] = APPLICATION_PATH "/../vendor/smarty/smarty/libs/sysplugins" |
||||
|
resources.smarty.debugging = 0 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
[development : production] |
||||
|
|
||||
|
mini_js = 0 |
||||
|
mini_css = 0 |
||||
|
|
||||
|
phpSettings.display_startup_errors = 1 |
||||
|
phpSettings.display_errors = 1 |
||||
|
resources.frontController.params.displayExceptions = 1 |
@ -0,0 +1,5 @@ |
|||||
|
user = vimbadmin |
||||
|
password = {{password}} |
||||
|
hosts = {{host}} |
||||
|
dbname = vimbadmin |
||||
|
query = SELECT goto FROM alias WHERE address = '%s' AND active = '1' |
@ -0,0 +1,5 @@ |
|||||
|
user = vimbadmin |
||||
|
password = {{password}} |
||||
|
hosts = {{host}} |
||||
|
dbname = vimbadmin |
||||
|
query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '0' AND active = '1' |
@ -0,0 +1,7 @@ |
|||||
|
user = vimbadmin |
||||
|
password = {{password}} |
||||
|
hosts = {{host}} |
||||
|
dbname = vimbadmin |
||||
|
table = mailbox |
||||
|
select_field = maildir |
||||
|
where_field = username |
@ -0,0 +1,34 @@ |
|||||
|
|
||||
|
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 {{^static}}rt_cache{{/static}}; |
||||
|
error_log /var/log/nginx/{{site_name}}.error.log; |
||||
|
{{^vma}}{{^rc}}root {{webroot}}/htdocs;{{/rc}}{{/vma}} |
||||
|
{{#vma}}root /var/www/22222/htdocs/vimbadmin/public;{{/vma}} |
||||
|
{{#rc}}root /var/www/roundcubemail/htdocs/;{{/rc}} |
||||
|
|
||||
|
index {{^static}}index.php{{/static}} index.html index.htm; |
||||
|
|
||||
|
{{#static}} |
||||
|
location / { |
||||
|
try_files $uri $uri/ /index.html; |
||||
|
} |
||||
|
{{/static}} |
||||
|
|
||||
|
{{^static}}include{{/static}} {{#basic}}common/php.conf;{{/basic}}{{#w3tc}}common/w3tc.conf;{{/w3tc}}{{#wpfc}}common/wpfc.conf;{{/wpfc}} {{#wpsc}}common/wpsc.conf;{{/wpsc}} |
||||
|
{{#wpsubdir}}include common/wpsubdir.conf;{{/wpsubdir}} |
||||
|
{{#wp}}include common/wpcommon.conf;{{/wp}} |
||||
|
include common/locations.conf; |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
|
||||
|
# W3TC NGINX CONFIGURATION |
||||
|
# DO NOT MODIFY, ALL CHNAGES LOST AFTER UPDATE EasyEngine (ee) |
||||
|
set $cache_uri $request_uri; |
||||
|
# POST requests and URL with a query string should always go to php |
||||
|
if ($request_method = POST) { |
||||
|
set $cache_uri 'null cache'; |
||||
|
} |
||||
|
if ($query_string != "") { |
||||
|
set $cache_uri 'null cache'; |
||||
|
} |
||||
|
# Don't cache URL containing the following segments |
||||
|
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") { |
||||
|
set $cache_uri 'null cache'; |
||||
|
} |
||||
|
# Don't use the cache for logged in users or recent commenter |
||||
|
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") { |
||||
|
set $cache_uri 'null cache'; |
||||
|
} |
||||
|
# Use cached or actual file if they exists, Otherwise pass request to WordPress |
||||
|
location / { |
||||
|
try_files /wp-content/cache/page_enhanced/${host}${cache_uri}_index.html $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 php; |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
# WordPress COMMON SETTINGS |
||||
|
# DO NOT MODIFY, ALL CHNAGES LOST AFTER UPDATE EasyEngine (ee) |
||||
|
# 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; |
||||
|
} |
||||
|
} |
||||
|
# Yoast sitemap |
||||
|
location ~ ([^/]*)sitemap(.*)\.x(m|s)l$ { |
||||
|
rewrite ^/sitemap\.xml$ /sitemap_index.xml permanent; |
||||
|
rewrite ^/([a-z]+)?-?sitemap\.xsl$ /index.php?xsl=$1 last; |
||||
|
# Rules for yoast sitemap with wp|wpsubdir|wpsubdomain |
||||
|
rewrite ^.*/sitemap_index\.xml$ /index.php?sitemap=1 last; |
||||
|
rewrite ^.*/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last; |
||||
|
# Following lines are options. Needed for WordPress seo addons |
||||
|
rewrite ^/news_sitemap\.xml$ /index.php?sitemap=wpseo_news last; |
||||
|
rewrite ^/locations\.kml$ /index.php?sitemap=wpseo_local_kml last; |
||||
|
rewrite ^/geo_sitemap\.xml$ /index.php?sitemap=wpseo_local last; |
||||
|
rewrite ^/video-sitemap\.xsl$ /index.php?xsl=video last; |
||||
|
access_log off; |
||||
|
} |
@ -0,0 +1,36 @@ |
|||||
|
# WPFC NGINX CONFIGURATION |
||||
|
# DO NOT MODIFY, ALL CHNAGES LOST AFTER UPDATE EasyEngine (ee) |
||||
|
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(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") { |
||||
|
set $skip_cache 1; |
||||
|
} |
||||
|
# Don't use the cache for logged in users or recent commenter |
||||
|
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") { |
||||
|
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 php; |
||||
|
fastcgi_cache_bypass $skip_cache; |
||||
|
fastcgi_no_cache $skip_cache; |
||||
|
fastcgi_cache WORDPRESS; |
||||
|
} |
||||
|
location ~ /purge(/.*) { |
||||
|
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1"; |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
# WPSC NGINX CONFIGURATION |
||||
|
# DO NOT MODIFY, ALL CHNAGES LOST AFTER UPDATE EasyEngine (ee) |
||||
|
set $cache_uri $request_uri; |
||||
|
# POST requests and URL with a query string should always go to php |
||||
|
if ($request_method = POST) { |
||||
|
set $cache_uri 'null cache'; |
||||
|
} |
||||
|
if ($query_string != "") { |
||||
|
set $cache_uri 'null cache'; |
||||
|
} |
||||
|
# Don't cache URL containing the following segments |
||||
|
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") { |
||||
|
set $cache_uri 'null cache'; |
||||
|
} |
||||
|
# Don't use the cache for logged in users or recent commenter |
||||
|
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") { |
||||
|
set $cache_uri 'null cache'; |
||||
|
} |
||||
|
# Use cached or actual file if they exists, Otherwise pass request to WordPress |
||||
|
location / { |
||||
|
# If we add index.php?$args its break WooCommerce like plugins |
||||
|
# Ref: #330 |
||||
|
try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php; |
||||
|
} |
||||
|
location ~ \.php$ { |
||||
|
try_files $uri =404; |
||||
|
include fastcgi_params; |
||||
|
fastcgi_pass php; |
||||
|
# Following line is needed by WP Super Cache plugin |
||||
|
fastcgi_param SERVER_NAME $http_host; |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
# WPSUBDIRECTORY NGINX CONFIGURATION |
||||
|
# DO NOT MODIFY, ALL CHNAGES LOST AFTER UPDATE EasyEngine (ee) |
||||
|
if (!-e $request_filename) { |
||||
|
# Redirect wp-admin to wp-admin/ |
||||
|
rewrite /wp-admin$ $scheme://$host$uri/ permanent; |
||||
|
# Redirect wp-* files/folders |
||||
|
rewrite ^(/[^/]+)?(/wp-.*) $2 last; |
||||
|
# Redirect other php files |
||||
|
rewrite ^(/[^/]+)?(/.*\.php) $2 last; |
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
"""EasyEngine SWAP creation""" |
||||
|
from ee.core.variables import EEVariables |
||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.fileutils import EEFileUtils |
||||
|
from ee.core.logging import Log |
||||
|
|
||||
|
|
||||
|
class EESwap(): |
||||
|
"""Manage Swap""" |
||||
|
|
||||
|
def __init__(): |
||||
|
"""Initialize """ |
||||
|
pass |
||||
|
|
||||
|
def add(self): |
||||
|
"""Swap addition with EasyEngine""" |
||||
|
if EEVariables.ee_ram < 512: |
||||
|
if EEVariables.ee_swap < 1000: |
||||
|
Log.info(self, "Adding SWAP") |
||||
|
EEShellExec.cmd_exec(self, "dd if=/dev/zero of=/ee-swapfile " |
||||
|
"bs=1024 count=1048k") |
||||
|
EEShellExec.cmd_exec(self, "mkswap /ee-swapfile") |
||||
|
EEFileUtils.chown(self, "/ee-swapfile", "root", "root") |
||||
|
EEFileUtils.chmod(self, "/ee-swapfile", 0o600) |
||||
|
EEShellExec.cmd_exec(self, "swapon /ee-swapfile") |
||||
|
with open("/etc/fstab", "a") as swap_file: |
||||
|
swap_file.write("/ee-swapfile\tnone\tswap\tsw\t0 0") |
@ -0,0 +1,78 @@ |
|||||
|
"""EasyEngine packages repository operations""" |
||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.variables import EEVariables |
||||
|
import os |
||||
|
|
||||
|
|
||||
|
class EERepo(): |
||||
|
"""Manage Repositories""" |
||||
|
|
||||
|
def __init__(self): |
||||
|
"""Initialize """ |
||||
|
pass |
||||
|
|
||||
|
def add(self, repo_url=None, ppa=None): |
||||
|
""" |
||||
|
This function used to add apt repositories and or ppa's |
||||
|
If repo_url is provided adds repo file to |
||||
|
/etc/apt/sources.list.d/ |
||||
|
If ppa is provided add apt-repository using |
||||
|
add-apt-repository |
||||
|
command. |
||||
|
""" |
||||
|
|
||||
|
if repo_url is not None: |
||||
|
repo_file_path = ("/etc/apt/sources.list.d/" |
||||
|
+ EEVariables().ee_repo_file) |
||||
|
try: |
||||
|
if not os.path.isfile(repo_file_path): |
||||
|
with open(repo_file_path, "a") as repofile: |
||||
|
repofile.write(repo_url) |
||||
|
repofile.write('\n') |
||||
|
repofile.close() |
||||
|
elif repo_url not in open(repo_file_path).read(): |
||||
|
with open(repo_file_path, "a") as repofile: |
||||
|
repofile.write(repo_url) |
||||
|
repofile.write('\n') |
||||
|
repofile.close() |
||||
|
return True |
||||
|
except IOError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "File I/O error.") |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to add repo") |
||||
|
if ppa is not None: |
||||
|
if EEVariables.ee_platform_distro == 'squeeze': |
||||
|
print("Cannot add repo for {distro}" |
||||
|
.format(distro=EEVariables.ee_platform_distro)) |
||||
|
else: |
||||
|
EEShellExec.cmd_exec(self, "add-apt-repository -y " |
||||
|
"'{ppa_name}'" |
||||
|
.format(ppa_name=ppa)) |
||||
|
|
||||
|
def remove(self, ppa=None): |
||||
|
""" |
||||
|
This function used to remove ppa's |
||||
|
If ppa is provided adds repo file to |
||||
|
/etc/apt/sources.list.d/ |
||||
|
command. |
||||
|
""" |
||||
|
EEShellExec.cmd_exec(self, "add-apt-repository -y " |
||||
|
"--remove '{ppa_name}'" |
||||
|
.format(ppa_name=repo_url)) |
||||
|
|
||||
|
def add_key(self, keyids, keyserver=None): |
||||
|
""" |
||||
|
This function adds imports repository keys from keyserver. |
||||
|
default keyserver is hkp://keys.gnupg.net |
||||
|
user can provide other keyserver with keyserver="hkp://xyz" |
||||
|
""" |
||||
|
if keyserver is None: |
||||
|
EEShellExec.cmd_exec(self, "gpg --keyserver {serv}" |
||||
|
.format(serv=(keyserver or |
||||
|
"hkp://keys.gnupg.net")) |
||||
|
+ " --recv-keys {key}".format(key=keyids)) |
||||
|
EEShellExec.cmd_exec(self, "gpg -a --export --armor {0}" |
||||
|
.format(keyids) |
||||
|
+ " | apt-key add - ") |
@ -0,0 +1,198 @@ |
|||||
|
"""EasyEngine package installation using apt-get module.""" |
||||
|
import apt |
||||
|
import apt_pkg |
||||
|
import sys |
||||
|
from ee.core.logging import Log |
||||
|
from sh import apt_get |
||||
|
|
||||
|
|
||||
|
class EEAptGet(): |
||||
|
"""Generic apt-get intialisation""" |
||||
|
|
||||
|
def update(self): |
||||
|
""" |
||||
|
Similar to `apt-get upgrade` |
||||
|
""" |
||||
|
try: |
||||
|
apt_cache = apt.cache.Cache() |
||||
|
import sys |
||||
|
orig_out = sys.stdout |
||||
|
sys.stdout = open(self.app.config.get('log.logging', 'file'), 'a') |
||||
|
apt_cache.update(apt.progress.text.AcquireProgress()) |
||||
|
sys.stdout = orig_out |
||||
|
# success = (apt_cache.commit( |
||||
|
# apt.progress.text.AcquireProgress(), |
||||
|
# apt.progress.base.InstallProgress())) |
||||
|
# #apt_cache.close() |
||||
|
# return success |
||||
|
except AttributeError as e: |
||||
|
Log.error(self, 'AttributeError: ' + str(e)) |
||||
|
except Exception as e: |
||||
|
Log.debug(self, 'SystemError: ' + str(e)) |
||||
|
Log.error(self, 'Unable to Fetch update') |
||||
|
|
||||
|
def dist_upgrade(): |
||||
|
""" |
||||
|
Similar to `apt-get upgrade` |
||||
|
""" |
||||
|
try: |
||||
|
apt_cache = apt.cache.Cache() |
||||
|
apt_cache.update() |
||||
|
apt_cache.open(None) |
||||
|
apt_cache.upgrade(True) |
||||
|
success = (apt_cache.commit( |
||||
|
apt.progress.text.AcquireProgress(), |
||||
|
apt.progress.base.InstallProgress())) |
||||
|
#apt_cache.close() |
||||
|
return success |
||||
|
except AttributeError as e: |
||||
|
Log.error(self, 'AttributeError: ' + str(e)) |
||||
|
except FetchFailedException as e: |
||||
|
Log.debug(self, 'SystemError: ' + str(e)) |
||||
|
Log.error(self, 'Unable to Fetch update') |
||||
|
|
||||
|
def install(self, packages): |
||||
|
""" |
||||
|
Similar to `apt-get install` |
||||
|
""" |
||||
|
apt_pkg.init() |
||||
|
# #apt_pkg.PkgSystemLock() |
||||
|
global apt_cache |
||||
|
apt_cache = apt.cache.Cache() |
||||
|
|
||||
|
def install_package(self, package_name): |
||||
|
pkg = apt_cache[package_name.strip()] |
||||
|
if package_name.strip() in apt_cache: |
||||
|
if pkg.is_installed: |
||||
|
#apt_pkg.PkgSystemUnLock() |
||||
|
Log.debug(self, 'Trying to install a package that ' |
||||
|
'is already installed (' + |
||||
|
package_name.strip() + ')') |
||||
|
#apt_cache.close() |
||||
|
return False |
||||
|
else: |
||||
|
try: |
||||
|
# print(pkg.name) |
||||
|
pkg.mark_install() |
||||
|
except Exception as e: |
||||
|
Log.debug(self, str(e)) |
||||
|
Log.error(self, str(e)) |
||||
|
else: |
||||
|
#apt_cache.close() |
||||
|
Log.error(self, 'Unknown package selected (' + |
||||
|
package_name.strip() + ')') |
||||
|
|
||||
|
for package in packages: |
||||
|
if not install_package(self, package): |
||||
|
continue |
||||
|
|
||||
|
if apt_cache.install_count > 0: |
||||
|
try: |
||||
|
#apt_pkg.PkgSystemUnLock() |
||||
|
orig_out = sys.stdout |
||||
|
sys.stdout = open(self.app.config.get('log.logging', 'file'), |
||||
|
'a') |
||||
|
result = apt_cache.commit(apt.progress.text.AcquireProgress(), |
||||
|
apt.progress.base.InstallProgress()) |
||||
|
sys.stdout = orig_out |
||||
|
#apt_cache.close() |
||||
|
return result |
||||
|
except SystemError as e: |
||||
|
Log.debug(self, 'SystemError: ' + str(e)) |
||||
|
Log.error(self, 'SystemError: ' + str(e)) |
||||
|
#apt_cache.close() |
||||
|
except Exception as e: |
||||
|
Log.debug(self, str(e)) |
||||
|
Log.error(self, str(e)) |
||||
|
|
||||
|
def remove(self, packages, auto=False, purge=False): |
||||
|
""" |
||||
|
Similar to `apt-get remove/purge` |
||||
|
purge packages if purge=True |
||||
|
""" |
||||
|
apt_pkg.init() |
||||
|
# apt_pkg.PkgSystemLock() |
||||
|
global apt_cache |
||||
|
apt_cache = apt.cache.Cache() |
||||
|
|
||||
|
def remove_package(self, package_name, purge=False): |
||||
|
pkg = apt_cache[package_name.strip()] |
||||
|
if package_name.strip() in apt_cache: |
||||
|
if not pkg.is_installed: |
||||
|
# apt_pkg.PkgSystemUnLock() |
||||
|
Log.debug(self, 'Trying to uninstall a package ' |
||||
|
'that is not installed (' + |
||||
|
package_name.strip() + ')') |
||||
|
return False |
||||
|
else: |
||||
|
try: |
||||
|
# print(pkg.name) |
||||
|
pkg.mark_delete(purge) |
||||
|
except SystemError as e: |
||||
|
Log.debug(self, 'SystemError: ' + str(e)) |
||||
|
return False |
||||
|
else: |
||||
|
# apt_cache.close() |
||||
|
Log.error(self, 'Unknown package selected (' + |
||||
|
package_name.strip() + ')') |
||||
|
|
||||
|
for package in packages: |
||||
|
if not remove_package(self, package, purge=purge): |
||||
|
continue |
||||
|
|
||||
|
if apt_cache.delete_count > 0: |
||||
|
try: |
||||
|
# apt_pkg.PkgSystemUnLock() |
||||
|
orig_out = sys.stdout |
||||
|
sys.stdout = open(self.app.config.get('log.logging', 'file'), |
||||
|
'a') |
||||
|
result = apt_cache.commit(apt.progress.text.AcquireProgress(), |
||||
|
apt.progress.base.InstallProgress()) |
||||
|
sys.stdout = orig_out |
||||
|
# apt_cache.close() |
||||
|
return result |
||||
|
except SystemError as e: |
||||
|
Log.debug(self, 'SystemError: ' + str(e)) |
||||
|
return False |
||||
|
except Exception as e: |
||||
|
Log.debug(self, str(e)) |
||||
|
Log.error(self, str(e)) |
||||
|
# apt_cache.close() |
||||
|
|
||||
|
def auto_clean(self): |
||||
|
""" |
||||
|
Similar to `apt-get autoclean` |
||||
|
""" |
||||
|
try: |
||||
|
orig_out = sys.stdout |
||||
|
sys.stdout = open(self.app.config.get('log.logging', 'file'), 'a') |
||||
|
apt_get.autoclean("-y") |
||||
|
sys.stdout = orig_out |
||||
|
except ErrorReturnCode as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to apt-get autoclean") |
||||
|
|
||||
|
def auto_remove(self): |
||||
|
""" |
||||
|
Similar to `apt-get autoremove` |
||||
|
""" |
||||
|
try: |
||||
|
Log.debug(self, "Running apt-get autoremove") |
||||
|
apt_get.autoremove("-y") |
||||
|
except ErrorReturnCode as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to apt-get autoremove") |
||||
|
|
||||
|
def is_installed(self, package_name): |
||||
|
""" |
||||
|
Checks if package is available in cache and is installed or not |
||||
|
returns True if installed otherwise returns False |
||||
|
""" |
||||
|
apt_cache = apt.cache.Cache() |
||||
|
apt_cache.open() |
||||
|
if (package_name.strip() in apt_cache and |
||||
|
apt_cache[package_name.strip()].is_installed): |
||||
|
# apt_cache.close() |
||||
|
return True |
||||
|
# apt_cache.close() |
||||
|
return False |
@ -0,0 +1,23 @@ |
|||||
|
from ee.core.shellexec import EEShellExec |
||||
|
from ee.core.variables import EEVariables |
||||
|
import os |
||||
|
|
||||
|
|
||||
|
def check_fqdn(self, ee_host): |
||||
|
"""FQDN check with EasyEngine, for mail server hostname must be FQDN""" |
||||
|
#ee_host=os.popen("hostname -f | tr -d '\n'").read() |
||||
|
if '.' in ee_host: |
||||
|
EEVariables.ee_fqdn = ee_host |
||||
|
with open('/etc/hostname', 'w') as hostfile: |
||||
|
hostfile.write(ee_host) |
||||
|
|
||||
|
EEShellExec.cmd_exec(self, "sed -i \"1i\\127.0.0.1 {0}\" /etc/hosts" |
||||
|
.format(ee_host)) |
||||
|
if EEVariables.ee_platform_distro == 'debian': |
||||
|
EEShellExec.cmd_exec(self, "/etc/init.d/hostname.sh start") |
||||
|
else: |
||||
|
EEShellExec.cmd_exec(self, "service hostname restart") |
||||
|
|
||||
|
else: |
||||
|
ee_host = input("Enter hostname [fqdn]:") |
||||
|
check_fqdn(self, ee_host) |
@ -0,0 +1,24 @@ |
|||||
|
"""EasyEngine generic database creation module""" |
||||
|
from sqlalchemy import create_engine |
||||
|
from sqlalchemy.orm import scoped_session, sessionmaker |
||||
|
from sqlalchemy.ext.declarative import declarative_base |
||||
|
from ee.core.variables import EEVariables |
||||
|
|
||||
|
# db_path = self.app.config.get('site', 'db_path') |
||||
|
engine = create_engine(EEVariables.ee_db_uri, convert_unicode=True) |
||||
|
db_session = scoped_session(sessionmaker(autocommit=False, |
||||
|
autoflush=False, |
||||
|
bind=engine)) |
||||
|
Base = declarative_base() |
||||
|
Base.query = db_session.query_property() |
||||
|
|
||||
|
|
||||
|
def init_db(): |
||||
|
""" |
||||
|
Initializes and creates all tables from models into the database |
||||
|
""" |
||||
|
# import all modules here that might define models so that |
||||
|
# they will be registered properly on the metadata. Otherwise |
||||
|
# you will have to import them first before calling init_db() |
||||
|
import ee.core.models |
||||
|
Base.metadata.create_all(bind=engine) |
@ -0,0 +1,24 @@ |
|||||
|
"""EasyEngine domain validation module.""" |
||||
|
from urllib.parse import urlparse |
||||
|
|
||||
|
|
||||
|
def ValidateDomain(url): |
||||
|
""" |
||||
|
This function returns domain name removing http:// and https:// |
||||
|
returns domain name only with or without www as user provided. |
||||
|
""" |
||||
|
|
||||
|
# Check if http:// or https:// present remove it if present |
||||
|
domain_name = url.split('/') |
||||
|
if 'http:' in domain_name or 'https:' in domain_name: |
||||
|
domain_name = domain_name[2] |
||||
|
else: |
||||
|
domain_name = domain_name[0] |
||||
|
www_domain_name = domain_name.split('.') |
||||
|
final_domain = '' |
||||
|
if www_domain_name[0] == 'www': |
||||
|
final_domain = '.'.join(www_domain_name[1:]) |
||||
|
return final_domain |
||||
|
else: |
||||
|
final_domain = domain_name |
||||
|
return (final_domain, domain_name) |
@ -0,0 +1,43 @@ |
|||||
|
"""EasyEngine download core classes.""" |
||||
|
import urllib.request |
||||
|
import urllib.error |
||||
|
import os |
||||
|
from ee.core.logging import Log |
||||
|
|
||||
|
|
||||
|
class EEDownload(): |
||||
|
"""Method to download using urllib""" |
||||
|
def __init__(): |
||||
|
pass |
||||
|
|
||||
|
def download(self, packages): |
||||
|
"""Download packages, packges must be list in format of |
||||
|
[url, path, package name]""" |
||||
|
for package in packages: |
||||
|
url = package[0] |
||||
|
filename = package[1] |
||||
|
pkg_name = package[2] |
||||
|
try: |
||||
|
directory = os.path.dirname(filename) |
||||
|
if not os.path.exists(directory): |
||||
|
os.makedirs(directory) |
||||
|
Log.info(self, "Downloading {0:20}".format(pkg_name), end=' ') |
||||
|
urllib.request.urlretrieve(url, filename) |
||||
|
Log.info(self, "{0}".format("[" + Log.ENDC + "Done" |
||||
|
+ Log.OKBLUE + "]")) |
||||
|
except urllib.error.URLError as e: |
||||
|
Log.debug(self, "[{err}]".format(err=str(e.reason))) |
||||
|
Log.error(self, "Unable to donwload file, {0}" |
||||
|
.format(filename)) |
||||
|
return False |
||||
|
except urllib.error.HTTPError as e: |
||||
|
Log.error(self, "Package download failed. {0}" |
||||
|
.format(pkg_name)) |
||||
|
Log.debug(self, "[{err}]".format(err=str(e.reason))) |
||||
|
return False |
||||
|
except urllib.error.ContentTooShortError as e: |
||||
|
Log.debug(self, "{0}{1}".format(e.errno, e.strerror)) |
||||
|
Log.error(self, "Package download failed. The amount of the" |
||||
|
" downloaded data is less than " |
||||
|
"the expected amount \{0} ".format(pkg_name)) |
||||
|
return False |
@ -0,0 +1,26 @@ |
|||||
|
"""EasyEngine exception classes.""" |
||||
|
|
||||
|
|
||||
|
class EEError(Exception): |
||||
|
"""Generic errors.""" |
||||
|
def __init__(self, msg): |
||||
|
Exception.__init__(self) |
||||
|
self.msg = msg |
||||
|
|
||||
|
def __str__(self): |
||||
|
return self.msg |
||||
|
|
||||
|
|
||||
|
class EEConfigError(EEError): |
||||
|
"""Config related errors.""" |
||||
|
pass |
||||
|
|
||||
|
|
||||
|
class EERuntimeError(EEError): |
||||
|
"""Generic runtime errors.""" |
||||
|
pass |
||||
|
|
||||
|
|
||||
|
class EEArgumentError(EEError): |
||||
|
"""Argument related errors.""" |
||||
|
pass |
@ -0,0 +1,21 @@ |
|||||
|
"""EasyEngine extarct core classes.""" |
||||
|
import tarfile |
||||
|
import os |
||||
|
from ee.core.logging import Log |
||||
|
|
||||
|
|
||||
|
class EEExtract(): |
||||
|
"""Method to extract from tar.gz file""" |
||||
|
|
||||
|
def extract(self, file, path): |
||||
|
"""Function to extract tar.gz file""" |
||||
|
try: |
||||
|
tar = tarfile.open(file) |
||||
|
tar.extractall(path=path) |
||||
|
tar.close() |
||||
|
os.remove(file) |
||||
|
return True |
||||
|
except tarfile.TarError as e: |
||||
|
Log.debug(self, "{0}{1}".format(e.errno, e.strerror)) |
||||
|
Log.error(self, 'Unable to extract file \{0}'.format(file)) |
||||
|
return False |
@ -0,0 +1,224 @@ |
|||||
|
"""EasyEngine file utils core classes.""" |
||||
|
import shutil |
||||
|
import os |
||||
|
import sys |
||||
|
import glob |
||||
|
import shutil |
||||
|
import pwd |
||||
|
import fileinput |
||||
|
from ee.core.logging import Log |
||||
|
|
||||
|
|
||||
|
class EEFileUtils(): |
||||
|
"""Utilities to operate on files""" |
||||
|
def __init__(): |
||||
|
pass |
||||
|
|
||||
|
def remove(self, filelist): |
||||
|
"""remove files from given path""" |
||||
|
for file in filelist: |
||||
|
if os.path.isfile(file): |
||||
|
Log.info(self, "Removing {0:65}".format(file), end=' ') |
||||
|
os.remove(file) |
||||
|
Log.info(self, "{0}".format("[" + Log.ENDC + "Done" + |
||||
|
Log.OKBLUE + "]")) |
||||
|
Log.debug(self, 'file Removed') |
||||
|
if os.path.isdir(file): |
||||
|
try: |
||||
|
Log.info(self, "Removing {0:65}".format(file), end=' ') |
||||
|
shutil.rmtree(file) |
||||
|
Log.info(self, "{0}".format("[" + Log.ENDC + "Done" + |
||||
|
Log.OKBLUE + "]")) |
||||
|
except shutil.Error as e: |
||||
|
Log.debug(self, "{err}".format(err=str(e.reason))) |
||||
|
Log.error(self, 'Unable to Remove file ') |
||||
|
|
||||
|
def create_symlink(self, paths, errormsg=''): |
||||
|
""" |
||||
|
Create symbolic links provided in list with first as source |
||||
|
and second as destination |
||||
|
""" |
||||
|
src = paths[0] |
||||
|
dst = paths[1] |
||||
|
if not os.path.islink(dst): |
||||
|
try: |
||||
|
os.symlink(src, dst) |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}{1}".format(e.errno, e.strerror)) |
||||
|
Log.error(self, "Unable to create symbolic link ...\n ") |
||||
|
else: |
||||
|
Log.debug(self, "Destination: {0} exists".format(dst)) |
||||
|
|
||||
|
def remove_symlink(self, filepath): |
||||
|
""" |
||||
|
Removes symbolic link for the path provided with filepath |
||||
|
""" |
||||
|
try: |
||||
|
os.unlink(filepath) |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to reomove symbolic link ...\n") |
||||
|
|
||||
|
def copyfile(self, src, dest): |
||||
|
""" |
||||
|
Copies files: |
||||
|
src : source path |
||||
|
dest : destination path |
||||
|
""" |
||||
|
try: |
||||
|
shutil.copy2(src, dest) |
||||
|
except shutil.Error as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, 'Unable to copy file from {0} to {1}' |
||||
|
.format(src, dest)) |
||||
|
except IOError as e: |
||||
|
Log.debug(self, "{e}".format(e.strerror)) |
||||
|
Log.error(self, "Unable to copy file from {0} to {1}" |
||||
|
.fromat(src, dest)) |
||||
|
|
||||
|
def searchreplace(self, fnm, sstr, rstr): |
||||
|
""" |
||||
|
Search replace strings in file |
||||
|
fnm : filename |
||||
|
sstr: search string |
||||
|
rstr: replace string |
||||
|
""" |
||||
|
try: |
||||
|
for line in fileinput.input(fnm, inplace=True): |
||||
|
print(line.replace(sstr, rstr), end='') |
||||
|
fileinput.close() |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to search {0} and replace {1} {2}" |
||||
|
.format(fnm, sstr, rstr)) |
||||
|
|
||||
|
def mvfile(self, src, dst): |
||||
|
""" |
||||
|
Moves file from source path to destination path |
||||
|
src : source path |
||||
|
dst : Destination path |
||||
|
""" |
||||
|
try: |
||||
|
Log.debug(self, "Moving file from {0} to {1}".format(src, dst)) |
||||
|
shutil.move(src, dst) |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{err}".format(err=e)) |
||||
|
Log.error(self, 'Unable to move file from {0} to {1}' |
||||
|
.format(src, dst)) |
||||
|
|
||||
|
def chdir(self, path): |
||||
|
""" |
||||
|
Change Directory to path specified |
||||
|
Path : path for destination directory |
||||
|
""" |
||||
|
try: |
||||
|
os.chdir(path) |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{err}".format(err=e.strerror)) |
||||
|
Log.error(self, 'Unable to Change Directory {0}'.format(path)) |
||||
|
|
||||
|
def chown(self, path, user, group, recursive=False): |
||||
|
""" |
||||
|
Change Owner for files |
||||
|
change owner for file with path specified |
||||
|
user: username of owner |
||||
|
group: group of owner |
||||
|
recursive: if recursive is True change owner for all |
||||
|
files in directory |
||||
|
""" |
||||
|
userid = pwd.getpwnam(user)[2] |
||||
|
groupid = pwd.getpwnam(user)[3] |
||||
|
try: |
||||
|
if recursive: |
||||
|
for root, dirs, files in os.walk(path): |
||||
|
for d in dirs: |
||||
|
os.chown(os.path.join(root, d), userid, |
||||
|
groupid) |
||||
|
for f in files: |
||||
|
os.chown(os.path.join(root, f), userid, |
||||
|
groupid) |
||||
|
else: |
||||
|
os.chown(path, userid, groupid) |
||||
|
except shutil.Error as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to change owner : {0}".format(path)) |
||||
|
except Exception as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to change owner : {0} ".format(path)) |
||||
|
|
||||
|
def chmod(self, path, perm, recursive=False): |
||||
|
""" |
||||
|
Changes Permission for files |
||||
|
path : file path permission to be changed |
||||
|
perm : permissions to be given |
||||
|
recursive: change permission recursively for all files |
||||
|
""" |
||||
|
try: |
||||
|
if recursive: |
||||
|
for root, dirs, files in os.walk(path): |
||||
|
for d in dirs: |
||||
|
os.chmod(os.path.join(root, d), perm) |
||||
|
for f in files: |
||||
|
os.chmod(os.path.join(root, f), perm) |
||||
|
else: |
||||
|
os.chmod(path, perm) |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}".format(e.strerror)) |
||||
|
Log.error(self, "Unable to change owner : {0}".format(path)) |
||||
|
|
||||
|
def mkdir(self, path): |
||||
|
""" |
||||
|
create directories. |
||||
|
path : path for directory to be created |
||||
|
Similar to `mkdir -p` |
||||
|
""" |
||||
|
try: |
||||
|
os.makedirs(path) |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}".format(e.strerror)) |
||||
|
Log.error(self, "Unable to create directory {0} ".format(path)) |
||||
|
|
||||
|
def isexist(self, path): |
||||
|
""" |
||||
|
Check if file exist on given path |
||||
|
""" |
||||
|
try: |
||||
|
if os.path.exists(path): |
||||
|
return (True) |
||||
|
else: |
||||
|
return (False) |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}".format(e.strerror)) |
||||
|
Log.error(self, "Unable to check path {0}".format(path)) |
||||
|
|
||||
|
def grep(self, fnm, sstr): |
||||
|
""" |
||||
|
Searches for string in file and returns the matched line. |
||||
|
""" |
||||
|
try: |
||||
|
for line in open(fnm): |
||||
|
if sstr in line: |
||||
|
return line |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}".format(e.strerror)) |
||||
|
Log.error(self, "Unable to Search string {0} in {1}" |
||||
|
.format(sstr, fnm)) |
||||
|
|
||||
|
def rm(self, path): |
||||
|
""" |
||||
|
Remove files |
||||
|
""" |
||||
|
if EEFileUtils.isexist(self, path): |
||||
|
try: |
||||
|
if os.path.isdir(path): |
||||
|
shutil.rmtree(path) |
||||
|
else: |
||||
|
os.remove(path) |
||||
|
except shutil.Error as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to remove directory : {0} " |
||||
|
.format(path)) |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to remove file : {0} " |
||||
|
.format(path)) |
@ -0,0 +1,57 @@ |
|||||
|
"""EasyEngine GIT module""" |
||||
|
from sh import git, ErrorReturnCode |
||||
|
from ee.core.logging import Log |
||||
|
import os |
||||
|
|
||||
|
|
||||
|
class EEGit: |
||||
|
"""Intialization of core variables""" |
||||
|
def ___init__(): |
||||
|
# TODO method for core variables |
||||
|
pass |
||||
|
|
||||
|
def add(self, paths, msg="Intializating"): |
||||
|
""" |
||||
|
Initializes Directory as repository if not already git repo. |
||||
|
and adds uncommited changes automatically |
||||
|
""" |
||||
|
for path in paths: |
||||
|
global git |
||||
|
git = git.bake("--git-dir={0}/.git".format(path), |
||||
|
"--work-tree={0}".format(path)) |
||||
|
if os.path.isdir(path): |
||||
|
if not os.path.isdir(path+"/.git"): |
||||
|
try: |
||||
|
Log.debug(self, "EEGit: git init at {0}" |
||||
|
.format(path)) |
||||
|
git.init(path) |
||||
|
except ErrorReturnCode as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to git init at {0}" |
||||
|
.format(path)) |
||||
|
status = git.status("-s") |
||||
|
if len(status.splitlines()) > 0: |
||||
|
try: |
||||
|
Log.debug(self, "EEGit: git commit at {0}" |
||||
|
.format(path)) |
||||
|
git.add("--all") |
||||
|
git.commit("-am {0}".format(msg)) |
||||
|
except ErrorReturnCode as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to git commit at {0} " |
||||
|
.format(path)) |
||||
|
else: |
||||
|
Log.debug(self, "EEGit: Path {0} not present".format(path)) |
||||
|
|
||||
|
def checkfilestatus(self, repo, filepath): |
||||
|
""" |
||||
|
Checks status of file, If its tracked or untracked. |
||||
|
""" |
||||
|
global git |
||||
|
git = git.bake("--git-dir={0}/.git".format(repo), |
||||
|
"--work-tree={0}".format(repo)) |
||||
|
status = git.status("-s", "{0}".format(filepath)) |
||||
|
if len(status.splitlines()) > 0: |
||||
|
return True |
||||
|
else: |
||||
|
return False |
@ -0,0 +1,43 @@ |
|||||
|
"""EasyEngine log module""" |
||||
|
|
||||
|
|
||||
|
class Log: |
||||
|
""" |
||||
|
Logs messages with colors for different messages |
||||
|
according to functions |
||||
|
""" |
||||
|
HEADER = '\033[95m' |
||||
|
OKBLUE = '\033[94m' |
||||
|
OKGREEN = '\033[92m' |
||||
|
WARNING = '\033[93m' |
||||
|
FAIL = '\033[91m' |
||||
|
ENDC = '\033[0m' |
||||
|
BOLD = '\033[1m' |
||||
|
UNDERLINE = '\033[4m' |
||||
|
|
||||
|
def error(self, msg): |
||||
|
""" |
||||
|
Logs error into log file |
||||
|
""" |
||||
|
print(Log.FAIL + msg + Log.ENDC) |
||||
|
self.app.log.error(Log.FAIL + msg + Log.ENDC) |
||||
|
self.app.close(1) |
||||
|
|
||||
|
def info(self, msg, end='\n'): |
||||
|
""" |
||||
|
Logs info messages into log file |
||||
|
""" |
||||
|
print(Log.OKBLUE + msg + Log.ENDC, end=end) |
||||
|
self.app.log.info(Log.OKBLUE + msg + Log.ENDC) |
||||
|
|
||||
|
def warn(self, msg): |
||||
|
""" |
||||
|
Logs warning into log file |
||||
|
""" |
||||
|
self.app.log.warn(Log.BOLD + msg + Log.ENDC) |
||||
|
|
||||
|
def debug(self, msg): |
||||
|
""" |
||||
|
Logs debug messages into log file |
||||
|
""" |
||||
|
self.app.log.debug(Log.HEADER + msg + Log.ENDC) |
@ -0,0 +1,195 @@ |
|||||
|
|
||||
|
""" |
||||
|
Real time log files watcher supporting log rotation. |
||||
|
""" |
||||
|
|
||||
|
import os |
||||
|
import time |
||||
|
import errno |
||||
|
import stat |
||||
|
from ee.core.logging import Log |
||||
|
|
||||
|
|
||||
|
class LogWatcher(object): |
||||
|
"""Looks for changes in all files of a directory. |
||||
|
This is useful for watching log file changes in real-time. |
||||
|
It also supports files rotation. |
||||
|
|
||||
|
Example: |
||||
|
|
||||
|
>>> def callback(filename, lines): |
||||
|
... print filename, lines |
||||
|
... |
||||
|
>>> l = LogWatcher("/var/www/example.com/logs", callback) |
||||
|
>>> l.loop() |
||||
|
""" |
||||
|
|
||||
|
def __init__(self, filelist, callback, extensions=["log"], tail_lines=0): |
||||
|
"""Arguments: |
||||
|
|
||||
|
(str) @folder: |
||||
|
the folder to watch |
||||
|
|
||||
|
(callable) @callback: |
||||
|
a function which is called every time a new line in a |
||||
|
file being watched is found; |
||||
|
this is called with "filename" and "lines" arguments. |
||||
|
|
||||
|
(list) @extensions: |
||||
|
only watch files with these extensions |
||||
|
|
||||
|
(int) @tail_lines: |
||||
|
read last N lines from files being watched before starting |
||||
|
""" |
||||
|
self.files_map = {} |
||||
|
self.filelist = filelist |
||||
|
self.callback = callback |
||||
|
# self.folder = os.path.realpath(folder) |
||||
|
self.extensions = extensions |
||||
|
# assert (os.path.isdir(self.folder), "%s does not exists" |
||||
|
# % self.folder) |
||||
|
for file in self.filelist: |
||||
|
assert (os.path.isfile(file)) |
||||
|
assert callable(callback) |
||||
|
self.update_files() |
||||
|
# The first time we run the script we move all file markers at EOF. |
||||
|
# In case of files created afterwards we don't do this. |
||||
|
for id, file in list(iter(self.files_map.items())): |
||||
|
file.seek(os.path.getsize(file.name)) # EOF |
||||
|
if tail_lines: |
||||
|
lines = self.tail(file.name, tail_lines) |
||||
|
if lines: |
||||
|
self.callback(file.name, lines) |
||||
|
|
||||
|
def __del__(self): |
||||
|
self.close() |
||||
|
|
||||
|
def loop(self, interval=0.1, async=False): |
||||
|
"""Start the loop. |
||||
|
If async is True make one loop then return. |
||||
|
""" |
||||
|
while 1: |
||||
|
self.update_files() |
||||
|
for fid, file in list(iter(self.files_map.items())): |
||||
|
self.readfile(file) |
||||
|
if async: |
||||
|
return |
||||
|
time.sleep(interval) |
||||
|
|
||||
|
def log(self, line): |
||||
|
"""Log when a file is un/watched""" |
||||
|
print(line) |
||||
|
|
||||
|
# def listdir(self): |
||||
|
# """List directory and filter files by extension. |
||||
|
# You may want to override this to add extra logic or |
||||
|
# globbling support. |
||||
|
# """ |
||||
|
# ls = os.listdir(self.folder) |
||||
|
# if self.extensions: |
||||
|
# return ([x for x in ls if os.path.splitext(x)[1][1:] |
||||
|
# in self.extensions]) |
||||
|
# else: |
||||
|
# return ls |
||||
|
|
||||
|
@staticmethod |
||||
|
def tail(fname, window): |
||||
|
"""Read last N lines from file fname.""" |
||||
|
try: |
||||
|
f = open(fname, 'r') |
||||
|
except IOError as err: |
||||
|
if err.errno == errno.ENOENT: |
||||
|
return [] |
||||
|
else: |
||||
|
raise |
||||
|
else: |
||||
|
BUFSIZ = 1024 |
||||
|
f.seek(0, os.SEEK_END) |
||||
|
fsize = f.tell() |
||||
|
block = -1 |
||||
|
data = "" |
||||
|
exit = False |
||||
|
while not exit: |
||||
|
step = (block * BUFSIZ) |
||||
|
if abs(step) >= fsize: |
||||
|
f.seek(0) |
||||
|
exit = True |
||||
|
else: |
||||
|
f.seek(step, os.SEEK_END) |
||||
|
data = f.read().strip() |
||||
|
if data.count('\n') >= window: |
||||
|
break |
||||
|
else: |
||||
|
block -= 1 |
||||
|
return data.splitlines()[-window:] |
||||
|
|
||||
|
def update_files(self): |
||||
|
ls = [] |
||||
|
for name in self.filelist: |
||||
|
absname = os.path.realpath(os.path.join(name)) |
||||
|
try: |
||||
|
st = os.stat(absname) |
||||
|
except EnvironmentError as err: |
||||
|
if err.errno != errno.ENOENT: |
||||
|
raise |
||||
|
else: |
||||
|
if not stat.S_ISREG(st.st_mode): |
||||
|
continue |
||||
|
fid = self.get_file_id(st) |
||||
|
ls.append((fid, absname)) |
||||
|
|
||||
|
# check existent files |
||||
|
for fid, file in list(iter(self.files_map.items())): |
||||
|
# next(iter(graph.items())) |
||||
|
try: |
||||
|
st = os.stat(file.name) |
||||
|
except EnvironmentError as err: |
||||
|
if err.errno == errno.ENOENT: |
||||
|
self.unwatch(file, fid) |
||||
|
else: |
||||
|
raise |
||||
|
else: |
||||
|
if fid != self.get_file_id(st): |
||||
|
# same name but different file (rotation); reload it. |
||||
|
self.unwatch(file, fid) |
||||
|
self.watch(file.name) |
||||
|
|
||||
|
# add new ones |
||||
|
for fid, fname in ls: |
||||
|
if fid not in self.files_map: |
||||
|
self.watch(fname) |
||||
|
|
||||
|
def readfile(self, file): |
||||
|
lines = file.readlines() |
||||
|
if lines: |
||||
|
self.callback(file.name, lines) |
||||
|
|
||||
|
def watch(self, fname): |
||||
|
try: |
||||
|
file = open(fname, "r") |
||||
|
fid = self.get_file_id(os.stat(fname)) |
||||
|
except EnvironmentError as err: |
||||
|
if err.errno != errno.ENOENT: |
||||
|
raise |
||||
|
else: |
||||
|
self.log("watching logfile %s" % fname) |
||||
|
self.files_map[fid] = file |
||||
|
|
||||
|
def unwatch(self, file, fid): |
||||
|
# file no longer exists; if it has been renamed |
||||
|
# try to read it for the last time in case the |
||||
|
# log rotator has written something in it. |
||||
|
lines = self.readfile(file) |
||||
|
self.log("un-watching logfile %s" % file.name) |
||||
|
del self.files_map[fid] |
||||
|
if lines: |
||||
|
self.callback(file.name, lines) |
||||
|
|
||||
|
@staticmethod |
||||
|
def get_file_id(st): |
||||
|
return "%xg%x" % (st.st_dev, st.st_ino) |
||||
|
|
||||
|
def close(self): |
||||
|
for id, file in list(iter(self.files_map.items())): |
||||
|
file.close() |
||||
|
self.files_map.clear() |
@ -0,0 +1,43 @@ |
|||||
|
from sqlalchemy import Column, DateTime, String, Integer, Boolean, func |
||||
|
from ee.core.database import Base |
||||
|
|
||||
|
|
||||
|
class SiteDB(Base): |
||||
|
""" |
||||
|
Databse model for site table |
||||
|
""" |
||||
|
__tablename__ = 'sites' |
||||
|
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) |
||||
|
|
||||
|
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): |
||||
|
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 |
||||
|
|
||||
|
# def __repr__(self): |
||||
|
# return '<Site %r>' % (self.site_type) |
||||
|
# |
||||
|
# def getType(self): |
||||
|
# return '%r>' % (self.site_type) |
@ -0,0 +1,62 @@ |
|||||
|
"""EasyEngine MySQL core classes.""" |
||||
|
import pymysql |
||||
|
import configparser |
||||
|
from os.path import expanduser |
||||
|
import sys |
||||
|
from ee.core.logging import Log |
||||
|
|
||||
|
|
||||
|
class EEMysql(): |
||||
|
"""Method for MySQL connection""" |
||||
|
|
||||
|
def execute(self, statement, errormsg=''): |
||||
|
"""Get login details from ~/.my.cnf & Execute MySQL query""" |
||||
|
config = configparser.RawConfigParser() |
||||
|
cnfpath = expanduser("~")+"/.my.cnf" |
||||
|
if [cnfpath] == config.read(cnfpath): |
||||
|
user = config.get('client', 'user') |
||||
|
passwd = config.get('client', 'password') |
||||
|
try: |
||||
|
host = config.get('client', 'host') |
||||
|
except configparser.NoOptionError as e: |
||||
|
host = 'localhost' |
||||
|
|
||||
|
try: |
||||
|
port = config.get('client', 'port') |
||||
|
except configparser.NoOptionError as e: |
||||
|
port = '3306' |
||||
|
|
||||
|
try: |
||||
|
conn = pymysql.connect(host=host, port=int(port), |
||||
|
user=user, passwd=passwd) |
||||
|
cur = conn.cursor() |
||||
|
except Exception as e: |
||||
|
if errormsg: |
||||
|
Log.debug(self, '{0}' |
||||
|
.format(e)) |
||||
|
Log.error(self, '{0}' |
||||
|
.format(errormsg)) |
||||
|
else: |
||||
|
Log.debug(self, '{0}' |
||||
|
.format(e)) |
||||
|
Log.error(self, 'Unable to connect to database: {0}' |
||||
|
.format(e)) |
||||
|
|
||||
|
try: |
||||
|
Log.debug(self, "Executing MySQL statement: {0}".format(statement)) |
||||
|
cur.execute(statement) |
||||
|
except Exception as e: |
||||
|
cur.close() |
||||
|
conn.close() |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
if not errormsg: |
||||
|
Log.error(self, 'Unable to execute statement') |
||||
|
else: |
||||
|
Log.error(self, '{0}'.format(errormsg)) |
||||
|
|
||||
|
cur.close() |
||||
|
conn.close() |
||||
|
|
||||
|
# def __del__(self): |
||||
|
# self.cur.close() |
||||
|
# self.conn.close() |
@ -0,0 +1,135 @@ |
|||||
|
"""EasyEngine service start/stop/restart module.""" |
||||
|
import os |
||||
|
import sys |
||||
|
import subprocess |
||||
|
from subprocess import Popen |
||||
|
from ee.core.logging import Log |
||||
|
import pystache |
||||
|
|
||||
|
|
||||
|
class EEService(): |
||||
|
"""Intialization for service""" |
||||
|
def ___init__(): |
||||
|
pass |
||||
|
|
||||
|
def start_service(self, service_name): |
||||
|
""" |
||||
|
start service |
||||
|
Similar to `service xyz start` |
||||
|
""" |
||||
|
try: |
||||
|
Log.info(self, "Start : {0:10}" .format(service_name), end='') |
||||
|
retcode = subprocess.getstatusoutput('service {0} start' |
||||
|
.format(service_name)) |
||||
|
if retcode[0] == 0: |
||||
|
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]") |
||||
|
return True |
||||
|
else: |
||||
|
Log.debug(self, "{0}".format(retcode[1])) |
||||
|
Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]") |
||||
|
return False |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "\nFailed to start service {0}" |
||||
|
.format(service_name)) |
||||
|
|
||||
|
def stop_service(self, service_name): |
||||
|
""" |
||||
|
Stop service |
||||
|
Similar to `service xyz stop` |
||||
|
""" |
||||
|
try: |
||||
|
Log.info(self, "Stop : {0:10}" .format(service_name), end='') |
||||
|
retcode = subprocess.getstatusoutput('service {0} stop' |
||||
|
.format(service_name)) |
||||
|
if retcode[0] == 0: |
||||
|
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]") |
||||
|
return True |
||||
|
else: |
||||
|
Log.debug(self, "{0}".format(retcode[1])) |
||||
|
Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]") |
||||
|
return False |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "\nFailed to stop service : {0}" |
||||
|
.format(service_name)) |
||||
|
|
||||
|
def restart_service(self, service_name): |
||||
|
""" |
||||
|
Restart service |
||||
|
Similar to `service xyz restart` |
||||
|
""" |
||||
|
try: |
||||
|
Log.info(self, "Restart : {0:10}".format(service_name), end='') |
||||
|
retcode = subprocess.getstatusoutput('service {0} restart' |
||||
|
.format(service_name)) |
||||
|
if retcode[0] == 0: |
||||
|
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]") |
||||
|
return True |
||||
|
else: |
||||
|
Log.debug(self, "{0}".format(retcode[1])) |
||||
|
Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]") |
||||
|
return False |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0} {1}".format(e.errno, e.strerror)) |
||||
|
Log.error(self, "\nFailed to restart service : {0}" |
||||
|
.format(service_name)) |
||||
|
|
||||
|
def reload_service(self, service_name): |
||||
|
""" |
||||
|
Stop service |
||||
|
Similar to `service xyz stop` |
||||
|
""" |
||||
|
try: |
||||
|
if service_name in ['nginx', 'php5-fpm']: |
||||
|
Log.info(self, "Reload : {0:10}".format(service_name), |
||||
|
end='') |
||||
|
retcode = subprocess.getstatusoutput('{0} -t &&' |
||||
|
' service {0} reload' |
||||
|
.format(service_name)) |
||||
|
if retcode[0] == 0: |
||||
|
# print(retcode[0]) |
||||
|
# subprocess.getstatusoutput('service {0} reload' |
||||
|
# .format(service_name)) |
||||
|
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + |
||||
|
"]") |
||||
|
return True |
||||
|
else: |
||||
|
Log.debug(self, "{0}".format(retcode[1])) |
||||
|
Log.info(self, "[" + Log.FAIL + "Failed" + |
||||
|
Log.OKBLUE+"]") |
||||
|
return False |
||||
|
Log.info(self, "Reload : {0:10}".format(service_name), end='') |
||||
|
retcode = subprocess.getstatusoutput('service {0} reload' |
||||
|
.format(service_name)) |
||||
|
if retcode[0] == 0: |
||||
|
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]") |
||||
|
return True |
||||
|
else: |
||||
|
Log.debug(self, "{0}".format(retcode[1])) |
||||
|
Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]") |
||||
|
return False |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "\nFailed to reload service {0}" |
||||
|
.format(service_name)) |
||||
|
|
||||
|
def get_service_status(self, service_name): |
||||
|
try: |
||||
|
is_exist = subprocess.getstatusoutput('which {0}' |
||||
|
.format(service_name)) |
||||
|
if is_exist[0] == 0: |
||||
|
retcode = subprocess.getstatusoutput('service {0} status' |
||||
|
.format(service_name)) |
||||
|
if retcode[0] == 0: |
||||
|
return True |
||||
|
else: |
||||
|
Log.debug(self, "{0}".format(retcode[1])) |
||||
|
return False |
||||
|
else: |
||||
|
return False |
||||
|
except OSError as e: |
||||
|
Log.debug(self, "{0}{1}".format(e.errno, e.strerror)) |
||||
|
Log.error(self, "Unable to get services status of {0}" |
||||
|
.format(service_name)) |
||||
|
return False |
@ -0,0 +1,51 @@ |
|||||
|
"""EasyEngine shell executaion functions.""" |
||||
|
from subprocess import Popen |
||||
|
from ee.core.logging import Log |
||||
|
import os |
||||
|
import sys |
||||
|
import subprocess |
||||
|
|
||||
|
|
||||
|
class EEShellExec(): |
||||
|
"""Method to run shell commands""" |
||||
|
def __init__(): |
||||
|
pass |
||||
|
|
||||
|
def cmd_exec(self, command, errormsg='', log=True): |
||||
|
"""Run shell command from Python""" |
||||
|
try: |
||||
|
if log: |
||||
|
Log.debug(self, "Running command: {0}".format(command)) |
||||
|
retcode = subprocess.getstatusoutput(command) |
||||
|
if retcode[0] == 0: |
||||
|
return True |
||||
|
else: |
||||
|
Log.debug(self, retcode[1]) |
||||
|
return False |
||||
|
except OSError as e: |
||||
|
if errormsg: |
||||
|
Log.error(self, errormsg) |
||||
|
else: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to execute command {0}" |
||||
|
.format(command)) |
||||
|
except Exception as e: |
||||
|
if errormsg: |
||||
|
Log.error(self, errormsg) |
||||
|
else: |
||||
|
Log.debug(self, "{0}".format(e)) |
||||
|
Log.error(self, "Unable to execute command {0}" |
||||
|
.format(command)) |
||||
|
|
||||
|
def invoke_editor(self, filepath, errormsg=''): |
||||
|
""" |
||||
|
Open files using sensible editor |
||||
|
""" |
||||
|
try: |
||||
|
subprocess.call(['sensible-editor', filepath]) |
||||
|
except OSError as e: |
||||
|
if errormsg: |
||||
|
Log.error(self, errormsg) |
||||
|
else: |
||||
|
Log.debug(self, "{0}{1}".format(e.errno, e.strerror)) |
||||
|
Log.error(self, "Unable to edit file {0}".format(filepath)) |
@ -0,0 +1,125 @@ |
|||||
|
"""EasyEngine core variable module""" |
||||
|
import platform |
||||
|
import socket |
||||
|
import configparser |
||||
|
import os |
||||
|
import sys |
||||
|
import psutil |
||||
|
import datetime |
||||
|
|
||||
|
|
||||
|
class EEVariables(): |
||||
|
"""Intialization of core variables""" |
||||
|
|
||||
|
# EasyEngine version |
||||
|
ee_version = "3.0.0" |
||||
|
|
||||
|
# EasyEngine packages versions |
||||
|
ee_wp_cli = "0.18.0" |
||||
|
ee_adminer = "4.1.0" |
||||
|
ee_roundcube = "1.1.0" |
||||
|
ee_vimbadmin = "3.0.11" |
||||
|
|
||||
|
# Current date and time of System |
||||
|
ee_date = datetime.datetime.now().strftime('%d%b%Y%H%M%S') |
||||
|
|
||||
|
# EasyEngine core variables |
||||
|
ee_platform_distro = platform.linux_distribution()[0] |
||||
|
ee_platform_version = platform.linux_distribution()[1] |
||||
|
ee_platform_codename = os.popen("lsb_release -sc | tr -d \'\\n\'").read() |
||||
|
|
||||
|
# Get FQDN of system |
||||
|
ee_fqdn = socket.getfqdn() |
||||
|
|
||||
|
# EasyEngien default webroot path |
||||
|
ee_webroot = '/var/www/' |
||||
|
|
||||
|
# PHP5 user |
||||
|
ee_php_user = 'www-data' |
||||
|
|
||||
|
# Get git user name and EMail |
||||
|
config = configparser.ConfigParser() |
||||
|
config.read(os.path.expanduser("~")+'/.gitconfig') |
||||
|
try: |
||||
|
ee_user = config['user']['name'] |
||||
|
ee_email = config['user']['email'] |
||||
|
except Exception as e: |
||||
|
ee_user = input("Enter your name: ") |
||||
|
ee_email = input("Enter your email: ") |
||||
|
os.system("git config --global user.name {0}".format(ee_user)) |
||||
|
os.system("git config --global user.email {0}".format(ee_email)) |
||||
|
|
||||
|
# Get System RAM and SWAP details |
||||
|
ee_ram = psutil.virtual_memory().total / (1024 * 1024) |
||||
|
ee_swap = psutil.swap_memory().total / (1024 * 1024) |
||||
|
|
||||
|
# MySQL hostname |
||||
|
ee_mysql_host = "" |
||||
|
config = configparser.RawConfigParser() |
||||
|
cnfpath = os.path.expanduser("~")+"/.my.cnf" |
||||
|
if [cnfpath] == config.read(cnfpath): |
||||
|
try: |
||||
|
ee_mysql_host = config.get('client', 'host') |
||||
|
except configparser.NoOptionError as e: |
||||
|
ee_mysql_host = "localhost" |
||||
|
else: |
||||
|
ee_mysql_host = "localhost" |
||||
|
|
||||
|
# EasyEngine stack installation varibales |
||||
|
# Nginx repo and packages |
||||
|
if ee_platform_distro == 'Ubuntu': |
||||
|
ee_nginx_repo = "ppa:rtcamp/nginx" |
||||
|
ee_nginx = ["nginx-custom", "nginx-common"] |
||||
|
elif ee_platform_distro == 'debian': |
||||
|
ee_nginx_repo = ("deb http://packages.dotdeb.org {codename} all" |
||||
|
.format(codename=ee_platform_codename)) |
||||
|
ee_nginx = ["nginx-full", "nginx-common"] |
||||
|
|
||||
|
# PHP repo and packages |
||||
|
if ee_platform_distro == 'Ubuntu': |
||||
|
ee_php_repo = "ppa:ondrej/php5" |
||||
|
elif ee_platform_codename == 'squeeze': |
||||
|
ee_php_repo = ("deb http://packages.dotdeb.org {codename}-php54 all" |
||||
|
.format(codename=ee_platform_codename)) |
||||
|
elif ee_platform_codename == 'wheezy': |
||||
|
ee_php_repo = ("deb http://packages.dotdeb.org {codename}-php55 all" |
||||
|
.format(codename=ee_platform_codename)) |
||||
|
ee_php = ["php5-fpm", "php5-curl", "php5-gd", "php5-imap", |
||||
|
"php5-mcrypt", "php5-xdebug", "php5-common", "php5-readline", |
||||
|
"php5-mysql", "php5-cli", "php5-memcache", "memcached", |
||||
|
"graphviz"] |
||||
|
|
||||
|
# MySQL repo and packages |
||||
|
ee_mysql_repo = ("deb http://repo.percona.com/apt {codename} main" |
||||
|
.format(codename=ee_platform_codename)) |
||||
|
ee_mysql = ["percona-server-server-5.6", "mysqltuner", "percona-toolkit"] |
||||
|
|
||||
|
# Postfix repo and packages |
||||
|
ee_postfix_repo = "" |
||||
|
ee_postfix = ["postfix"] |
||||
|
|
||||
|
# Mail repo and packages |
||||
|
ee_mail_repo = ("deb http://http.debian.net/debian-backports {codename}" |
||||
|
"-backports main".format(codename=ee_platform_codename)) |
||||
|
|
||||
|
ee_mail = ["dovecot-core", "dovecot-imapd", "dovecot-pop3d", |
||||
|
"dovecot-lmtpd", "dovecot-mysql", "dovecot-sieve", |
||||
|
"dovecot-managesieved", "postfix-mysql", "php5-cgi", |
||||
|
"php-gettext", "php-pear"] |
||||
|
|
||||
|
# Mailscanner repo and packages |
||||
|
ee_mailscanner_repo = () |
||||
|
ee_mailscanner = ["amavisd-new", "spamassassin", "clamav", "clamav-daemon", |
||||
|
"arj", "zoo", "nomarch", "lzop", "cabextract", "p7zip", |
||||
|
"rpm", "unrar-free"] |
||||
|
|
||||
|
# Repo path |
||||
|
ee_repo_file = "ee-repo.list" |
||||
|
ee_repo_file_path = ("/etc/apt/sources.list.d/" + ee_repo_file) |
||||
|
|
||||
|
# Application dabase file path |
||||
|
basedir = os.path.abspath(os.path.dirname('/var/lib/ee/')) |
||||
|
ee_db_uri = 'sqlite:///' + os.path.join(basedir, 'ee.db') |
||||
|
|
||||
|
def __init__(self): |
||||
|
pass |
@ -0,0 +1,15 @@ |
|||||
|
"""Testing utilities for EasyEngine.""" |
||||
|
from ee.cli.main import EETestApp |
||||
|
from cement.utils.test import * |
||||
|
|
||||
|
|
||||
|
class EETestCase(CementTestCase): |
||||
|
app_class = EETestApp |
||||
|
|
||||
|
def setUp(self): |
||||
|
"""Override setup actions (for every test).""" |
||||
|
super(EETestCase, self).setUp() |
||||
|
|
||||
|
def tearDown(self): |
||||
|
"""Override teardown actions (for every test).""" |
||||
|
super(EETestCase, self).tearDown() |
@ -0,0 +1,244 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
# EasyEngine update script. |
||||
|
# This script is designed to install latest EasyEngine or |
||||
|
# to update current EasyEngine from 2.x to 3.x |
||||
|
|
||||
|
old_ee_version="2.2.3" |
||||
|
branch=$1 |
||||
|
|
||||
|
# Define echo function |
||||
|
# Blue color |
||||
|
|
||||
|
function ee_lib_echo() |
||||
|
{ |
||||
|
echo $(tput setaf 4)$@$(tput sgr0) |
||||
|
} |
||||
|
# White color |
||||
|
function ee_lib_echo_info() |
||||
|
{ |
||||
|
echo $(tput setaf 7)$@$(tput sgr0) |
||||
|
} |
||||
|
# Red color |
||||
|
function ee_lib_echo_fail() |
||||
|
{ |
||||
|
echo $(tput setaf 1)$@$(tput sgr0) |
||||
|
} |
||||
|
|
||||
|
# Capture errors |
||||
|
function ee_lib_error() |
||||
|
{ |
||||
|
echo "[ `date` ] $(tput setaf 1)$@$(tput sgr0)" |
||||
|
exit $2 |
||||
|
} |
||||
|
|
||||
|
function install_dep() |
||||
|
{ |
||||
|
# Execute: apt-get update |
||||
|
ee_lib_echo "Executing apt-get update" |
||||
|
apt-get update &>> /dev/null |
||||
|
|
||||
|
# Install Python3 on users system |
||||
|
ee_lib_echo "Installing pre depedencies" |
||||
|
apt-get -y install python3 python3-apt python3-setuptools python3-dev sqlite3 git |
||||
|
if [[ $? -ne 0 ]]; then |
||||
|
ee_lib_echo_fail "Unable to install pre depedencies" |
||||
|
exit 1 |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
function sync_db() |
||||
|
{ |
||||
|
mkdir /var/lib/ee |
||||
|
|
||||
|
# Sqlite query to create table `sites` into ee.db which will be used by ee.3.0 |
||||
|
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 |
||||
|
);" | sqlite3 /var/lib/ee/ee.db |
||||
|
|
||||
|
for site in $(ls /etc/nginx/sites-available/ | grep -v default); |
||||
|
do |
||||
|
if [ -f /etc/nginx/sites-available/$site ]; then |
||||
|
ENABLE_STATUS='1' |
||||
|
else |
||||
|
ENABLE_STATUS='0' |
||||
|
fi |
||||
|
# Find out information about current NGINX configuration |
||||
|
EE_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) |
||||
|
# Detect current website type and cache |
||||
|
if [ "$EE_SITE_CURRENT_TYPE" = "HTML" ]; then |
||||
|
EE_SITE_CURRENT="html" |
||||
|
EE_SITE_CURRENT_CACHE="basic" |
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "PHP" ]; then |
||||
|
EE_SITE_CURRENT="php" |
||||
|
EE_SITE_CURRENT_CACHE="basic" |
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "MYSQL" ]; then |
||||
|
EE_SITE_CURRENT="mysql" |
||||
|
EE_SITE_CURRENT_CACHE="basic" |
||||
|
# Single WordPress |
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSINGLE BASIC" ]; then |
||||
|
EE_SITE_CURRENT="wp" |
||||
|
EE_SITE_CURRENT_CACHE="basic" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSINGLE WP SUPER CACHE" ]; then |
||||
|
EE_SITE_CURRENT="wp" |
||||
|
EE_SITE_CURRENT_CACHE="wpsc" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSINGLE W3 TOTAL CACHE" ]; then |
||||
|
EE_SITE_CURRENT="wp" |
||||
|
EE_SITE_CURRENT_CACHE="w3tc" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSINGLE FAST CGI" ] || [ "$EE_SITE_CURRENT_TYPE" = "WPSINGLE FASTCGI" ]; then |
||||
|
EE_SITE_CURRENT="wp" |
||||
|
EE_SITE_CURRENT_CACHE="wpfc" |
||||
|
|
||||
|
# WordPress subdirectory |
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDIR BASIC" ]; then |
||||
|
EE_SITE_CURRENT="wpsubdir" |
||||
|
EE_SITE_CURRENT_CACHE="basic" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDIR WP SUPER CACHE" ]; then |
||||
|
EE_SITE_CURRENT="wpsubdir" |
||||
|
EE_SITE_CURRENT_CACHE="wpsc" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDIR W3 TOTAL CACHE" ]; then |
||||
|
EE_SITE_CURRENT="wpsubdir" |
||||
|
EE_SITE_CURRENT_CACHE="w3tc" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDIR FAST CGI" ] || [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDIR FASTCGI" ]; then |
||||
|
EE_SITE_CURRENT="wpsubdir" |
||||
|
EE_SITE_CURRENT_CACHE="wpfc" |
||||
|
|
||||
|
# WordPress subdomain |
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDOMAIN BASIC" ]; then |
||||
|
EE_SITE_CURRENT="wpsubdomain" |
||||
|
EE_SITE_CURRENT_CACHE="basic" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDOMAIN WP SUPER CACHE" ]; then |
||||
|
EE_SITE_CURRENT="wpsubdomain" |
||||
|
EE_SITE_CURRENT_CACHE="wpsc" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDOMAIN W3 TOTAL CACHE" ]; then |
||||
|
EE_SITE_CURRENT="wpsubdomain" |
||||
|
EE_SITE_CURRENT_CACHE="w3tc" |
||||
|
|
||||
|
elif [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDOMAIN FAST CGI" ] || [ "$EE_SITE_CURRENT_TYPE" = "WPSUBDOMAIN FASTCGI" ]; then |
||||
|
EE_SITE_CURRENT="wpsubdomain" |
||||
|
EE_SITE_CURRENT_CACHE="wpfc" |
||||
|
fi |
||||
|
|
||||
|
WEBROOT="/var/www/$site" |
||||
|
|
||||
|
# Insert query to insert old site information into ee.db |
||||
|
echo "INSERT INTO sites (sitename, site_type, cache_type, site_path, is_enabled, is_ssl, storage_fs, storage_db) |
||||
|
VALUES (\"$site\", \"$EE_SITE_CURRENT\", \"$EE_SITE_CURRENT_CACHE\", \"$WEBROOT\", \"$ENABLE_STATUS\", 0, 'ext4', 'mysql');" | sqlite3 /var/lib/ee/ee.db |
||||
|
|
||||
|
done |
||||
|
} |
||||
|
|
||||
|
|
||||
|
function install_ee3() |
||||
|
{ |
||||
|
# Remove old clone of EasyEngine (ee) if any |
||||
|
rm -rf /tmp/easyengine &>> /dev/null |
||||
|
|
||||
|
# Clone EE 3.0 Python branch |
||||
|
ee_lib_echo "Cloning EasyEngine 3.0" |
||||
|
if [ "$branch" = "" ]; then |
||||
|
branch=stable |
||||
|
fi |
||||
|
|
||||
|
git clone -b $branch https://github.com/rtCamp/easyengine.git /tmp/easyengine --quiet > /dev/null || ee_lib_error "Unable to clone EasyEngine, exit status" 1 |
||||
|
|
||||
|
cd /tmp/easyengine |
||||
|
ee_lib_echo "Installing EasyEngine 3.0" |
||||
|
python3 setup.py install || ee_lib_error "Unable to install EasyEngine 3.0, exit status " 1 |
||||
|
|
||||
|
} |
||||
|
|
||||
|
function update_to_ee3() |
||||
|
{ |
||||
|
# Preserve old configuration |
||||
|
ee_lib_echo "Updating EasyEngine 3.0 configuration" |
||||
|
|
||||
|
grant_host=$(grep grant-host /etc/easyengine/ee.conf | awk '{ print $3 }') |
||||
|
db_name=$(grep db-name /etc/easyengine/ee.conf | awk '{ print $3 }') |
||||
|
db_user=$(grep db-name /etc/easyengine/ee.conf | awk '{ print $3 }') |
||||
|
wp_prefix=$(grep prefix /etc/easyengine/ee.conf | awk '{ print $3 }') |
||||
|
wp_user=$(grep 'user ' /etc/easyengine/ee.conf | grep -v db-user |awk '{ print $3 }') |
||||
|
wp_pass=$(grep password /etc/easyengine/ee.conf | awk '{ print $3 }') |
||||
|
wp_email=$(grep email /etc/easyengine/ee.conf | awk '{ print $3 }') |
||||
|
ip_addr=$(grep ip-address /etc/easyengine/ee.conf |awk -F'=' '{ print $2 }') |
||||
|
|
||||
|
sed -i "s/ip-address.*/ip-address = ${ip_addr}/" /etc/ee/ee.conf && \ |
||||
|
sed -i "s/grant-host.*/grant-host = ${grant_host}/" /etc/ee/ee.conf && \ |
||||
|
sed -i "s/db-name.*/db-name = ${db-name}/" /etc/ee/ee.conf && \ |
||||
|
sed -i "s/db-user.*/db-user = ${db_user}/" /etc/ee/ee.conf && \ |
||||
|
sed -i "s/prefix.*/prefix = ${wp_prefix}/" /etc/ee/ee.conf && \ |
||||
|
sed -i "s/^user.*/user = ${wp_user}/" /etc/ee/ee.conf && \ |
||||
|
sed -i "s/password.*/password = ${wp_password}/" /etc/ee/ee.conf && \ |
||||
|
sed -i "s/email.*/email = ${wp_email}/" /etc/ee/ee.conf || ee_lib_error "Unable to update configuration, exit status " 1 |
||||
|
|
||||
|
|
||||
|
# Remove old EasyEngine |
||||
|
ee_lib_echo "Removing EasyEngine 2" |
||||
|
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/ee /usr/local/sbin/ee |
||||
|
|
||||
|
} |
||||
|
|
||||
|
function git_init() |
||||
|
{ |
||||
|
# Do git intialisation on EasyEngine configuration |
||||
|
cd /etc/ee |
||||
|
if [ ! -d /etc/ee/.git ]; then |
||||
|
git init > /dev/null |
||||
|
fi |
||||
|
git add . |
||||
|
git commit -am "Installed/Updated to EasyEngine 3" > /dev/null |
||||
|
|
||||
|
} |
||||
|
|
||||
|
# Checking permissions |
||||
|
if [[ $EUID -ne 0 ]]; then |
||||
|
ee_lib_echo_fail "Sudo privilege required..." |
||||
|
ee_lib_echo_fail "Uses: wget -qO ee rt.cx/ee && sudo bash ee" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
if [ -f /usr/local/sbin/easyengine ]; then |
||||
|
# Check old EasyEngine version |
||||
|
ee version | grep ${old_ee_version} &>> /dev/null |
||||
|
if [[ $? -ne 0 ]]; then |
||||
|
ee_lib_echo "EasyEngine $old_ee_version not found on your system" |
||||
|
ee_lib_echo "Updating your EasyEngine to $old_ee_version for compability" |
||||
|
wget -q https://raw.githubusercontent.com/rtCamp/easyengine/old-stable/bin/update && bash update |
||||
|
if [[ $? -ne 0 ]]; then |
||||
|
ee_lib_echo_info "Unbale to update EasyEngine2 to $old_ee_version" |
||||
|
exit 1 |
||||
|
fi |
||||
|
fi |
||||
|
install_dep |
||||
|
sync_db |
||||
|
install_ee3 |
||||
|
update_to_ee3 |
||||
|
git_init |
||||
|
elif [ ! -f /usr/local/bin/ee ]; then |
||||
|
install_dep |
||||
|
install_ee3 |
||||
|
git_init |
||||
|
else |
||||
|
ee_lib_echo_fail "EasyEngine 3 allready installed on your system" |
||||
|
exit 1 |
||||
|
fi |
@ -0,0 +1 @@ |
|||||
|
cement>=2.4.0 |
@ -0,0 +1,9 @@ |
|||||
|
[nosetests] |
||||
|
verbosity=3 |
||||
|
debug=0 |
||||
|
detailed-errors=1 |
||||
|
with-coverage=1 |
||||
|
cover-package=ee |
||||
|
cover-erase=1 |
||||
|
cover-html=1 |
||||
|
cover-html-dir=coverage_report/ |
@ -0,0 +1,109 @@ |
|||||
|
|
||||
|
from setuptools import setup, find_packages |
||||
|
import sys |
||||
|
import os |
||||
|
import glob |
||||
|
import configparser |
||||
|
import re |
||||
|
|
||||
|
conf = [] |
||||
|
templates = [] |
||||
|
|
||||
|
long_description = '''EasyEngine 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('ee/cli/templates/*.mustache'): |
||||
|
templates.insert(1, name) |
||||
|
|
||||
|
if not os.path.exists('/var/log/ee/'): |
||||
|
os.makedirs('/var/log/ee/') |
||||
|
|
||||
|
if not os.path.exists('/var/lib/ee/'): |
||||
|
os.makedirs('/var/lib/ee/') |
||||
|
|
||||
|
# EasyEngine git function |
||||
|
config = configparser.ConfigParser() |
||||
|
config.read(os.path.expanduser("~")+'/.gitconfig') |
||||
|
try: |
||||
|
ee_user = config['user']['name'] |
||||
|
ee_email = config['user']['email'] |
||||
|
except Exception as e: |
||||
|
print("EasyEngine (ee) required your name & email address to track" |
||||
|
" changes you made under the Git version control") |
||||
|
print("EasyEngine (ee) will be able to send you daily reports & alerts in " |
||||
|
"upcoming version") |
||||
|
print("EasyEngine (ee) will NEVER send your information across") |
||||
|
|
||||
|
ee_user = input("Enter your name: ") |
||||
|
while ee_user is "": |
||||
|
print("Name not Valid, Please enter again") |
||||
|
ee_user = input("Enter your name: ") |
||||
|
|
||||
|
ee_email = input("Enter your email: ") |
||||
|
|
||||
|
while not re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*$", |
||||
|
ee_email): |
||||
|
print("EMail not Valid, Please enter again") |
||||
|
ee_email = input("Enter your email: ") |
||||
|
|
||||
|
os.system("git config --global user.name {0}".format(ee_user)) |
||||
|
os.system("git config --global user.email {0}".format(ee_email)) |
||||
|
|
||||
|
setup(name='ee', |
||||
|
version='3.0', |
||||
|
description=long_description, |
||||
|
long_description=long_description, |
||||
|
classifiers=[], |
||||
|
keywords='', |
||||
|
author='rtCamp Soultions Pvt. LTD', |
||||
|
author_email='sys@rtcamp.com', |
||||
|
url='http://rtcamp.com/easyengine', |
||||
|
license='GPL', |
||||
|
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', |
||||
|
'pymysql3 == 0.4', |
||||
|
'psutil', |
||||
|
'sh', |
||||
|
'sqlalchemy', |
||||
|
], |
||||
|
data_files=[('/etc/ee', ['config/ee.conf']), |
||||
|
('/etc/ee/plugins.d', conf), |
||||
|
('/usr/lib/ee/templates', templates), |
||||
|
('/etc/bash_completion.d/', |
||||
|
['config/bash_completion.d/ee_auto.rc']), |
||||
|
('/usr/share/man/man8/', ['docs/ee.8'])], |
||||
|
setup_requires=[], |
||||
|
entry_points=""" |
||||
|
[console_scripts] |
||||
|
ee = ee.cli.main:main |
||||
|
""", |
||||
|
namespace_packages=[], |
||||
|
) |
||||
|
|
||||
|
print("""\033[94m |
||||
|
For EasyEngine (ee) auto completion, run the following command |
||||
|
\033[92m |
||||
|
source /etc/bash_completion.d/ee_auto.rc |
||||
|
\033[94m |
||||
|
EasyEngine (ee) installed successfully |
||||
|
EasyEngine (ee) help: https://rtcamp.com/easyengine/docs/ |
||||
|
\033[0m |
||||
|
""") |
@ -0,0 +1,76 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseStack(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_cli_stack_install_mail(self): |
||||
|
self.app = get_test_app(argv=['stack', 'install', '--mail']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_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_ee_cli_stack_install_postfix(self): |
||||
|
self.app = get_test_app(argv=['stack', 'install', '--postfix']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_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_ee_cli_stack_install_utils(self): |
||||
|
self.app = get_test_app(argv=['stack', 'install', '--utils']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
@ -0,0 +1,52 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseStack(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_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_ee_cli_stack_services_start_postfix(self): |
||||
|
self.app = get_test_app(argv=['stack', 'start', '--postfix']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_cli_stack_services_start_dovecot(self): |
||||
|
self.app = get_test_app(argv=['stack', 'start', '--dovecot']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_cli_stack_services_start_all(self): |
||||
|
self.app = get_test_app(argv=['stack', 'start']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
@ -0,0 +1,52 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseStack(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_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_ee_cli_stack_services_status_postfix(self): |
||||
|
self.app = get_test_app(argv=['stack', 'status', '--postfix']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_cli_stack_services_status_dovecot(self): |
||||
|
self.app = get_test_app(argv=['stack', 'status', '--dovecot']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_cli_stack_services_status_all(self): |
||||
|
self.app = get_test_app(argv=['stack', 'status']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
@ -0,0 +1,52 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseStack(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_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_ee_cli_stack_services_stop_postfix(self): |
||||
|
self.app = get_test_app(argv=['stack', 'stop', '--postfix']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_cli_stack_services_stop_dovecot(self): |
||||
|
self.app = get_test_app(argv=['stack', 'stop', '--dovecot']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_cli_stack_services_stop_all(self): |
||||
|
self.app = get_test_app(argv=['stack', 'stop']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
@ -0,0 +1,52 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseStack(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_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_ee_cli_stack_services_restart_postfix(self): |
||||
|
self.app = get_test_app(argv=['stack', 'restart', '--postfix']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_cli_stack_services_restart_dovecot(self): |
||||
|
self.app = get_test_app(argv=['stack', 'restart', '--dovecot']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_cli_stack_services_restart_all(self): |
||||
|
self.app = get_test_app(argv=['stack', 'restart']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
@ -0,0 +1,73 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseSite(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_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_ee_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_ee_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_ee_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_ee_cli_site_create_w3tc(self): |
||||
|
self.app = get_test_app(argv=['site', 'create', 'example7.com', |
||||
|
'--w3tc']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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() |
@ -0,0 +1,16 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseSite(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_cli_site_info(self): |
||||
|
self.app = get_test_app(argv=['site', 'info', 'example1.com']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
@ -0,0 +1,22 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseSite(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_cli_site_list_disable(self): |
||||
|
self.app = get_test_app(argv=['site', 'list', '--disabled']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
@ -0,0 +1,16 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseSite(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_cli_show_edit(self): |
||||
|
self.app = get_test_app(argv=['site', 'show', 'example1.com']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
@ -0,0 +1,73 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseSite(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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_ee_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_ee_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_ee_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_ee_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_ee_cli_site_update_w3tc(self): |
||||
|
self.app = get_test_app(argv=['site', 'update', 'example8.com', |
||||
|
'--w3tc']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_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_ee_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() |
@ -0,0 +1,16 @@ |
|||||
|
from ee.utils import test |
||||
|
from ee.cli.main import get_test_app |
||||
|
|
||||
|
|
||||
|
class CliTestCaseSite(test.EETestCase): |
||||
|
|
||||
|
def test_ee_cli(self): |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
||||
|
|
||||
|
def test_ee_cli_site_enable(self): |
||||
|
self.app = get_test_app(argv=['site', 'enable', 'example2.com']) |
||||
|
self.app.setup() |
||||
|
self.app.run() |
||||
|
self.app.close() |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue