Browse Source

Merge branch 'python' of https://github.com/rtCamp/easyengine into python

bugfixes
shital.rtcamp 10 years ago
parent
commit
fbf6f8adc1
  1. 2
      .travis.yml
  2. 57
      ee/cli/plugins/debug.py
  3. 82
      ee/cli/plugins/stack.py
  4. 2
      ee/cli/templates/50-user.mustache
  5. 4
      ee/cli/templates/vimbadmin.mustache
  6. 11
      ee/core/apt_repo.py
  7. 16
      ee/core/aptget.py
  8. 22
      ee/core/checkfqdn.py

2
.travis.yml

@ -13,6 +13,8 @@ before_install:
- rm -rf ~/.gnupg
before_script:
- sudo bash -c 'echo example.com > /etc/hostname'
- sudo service hostname restart
- sudo apt-get -qq purge mysql* graphviz*
- sudo apt-get -qq autoremove

57
ee/cli/plugins/debug.py

@ -6,8 +6,11 @@ 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
import os
import configparser
import glob
import signal
def debug_plugin_hook(app):
@ -70,7 +73,7 @@ class EEDebugController(CementBaseController):
if not self.trigger_nginx:
Log.info(self, "Nginx debug connection already enabled")
self.msg = self.msg + [" /var/log/nginx/*.error.log"]
self.msg = self.msg + ["/var/log/nginx/*.error.log"]
# stop global debug
elif not self.start and not self.app.pargs.site_name:
@ -99,7 +102,7 @@ class EEDebugController(CementBaseController):
else:
Log.info(self, "Debug for site allready enabled")
self.msg = self.msg + ['/var/www//logs/error.log'
self.msg = self.msg + ['/var/www/{0}/logs/error.log'
.format(self.app.pargs.site_name)]
else:
@ -143,6 +146,7 @@ class EEDebugController(CementBaseController):
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")
@ -161,6 +165,7 @@ class EEDebugController(CementBaseController):
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")
@ -185,6 +190,7 @@ class EEDebugController(CementBaseController):
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\" "
@ -280,6 +286,11 @@ class EEDebugController(CementBaseController):
.format(webroot))
else:
Log.info(self, "WordPress debug log already enabled")
self.msg = self.msg + ['/var/www/{0}/htdocs/wp-content'
'/debug.log'
.format(self.app.pargs.site_name)]
else:
Log.info(self, "{0} domain not valid"
.format(self.app.pargs.site_name))
@ -374,6 +385,31 @@ class EEDebugController(CementBaseController):
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):
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):
self.start = True
@ -425,10 +461,19 @@ class EEDebugController(CementBaseController):
# Reload PHP
if self.trigger_php:
EEService.reload_service(self, 'php5-fpm')
#
# if len(self.msg) > 0:
# self.app.log.info("Use following command to check debug logs:"
# "\n{0}".format(self.msg.join()))
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):

82
ee/cli/plugins/stack.py

@ -12,6 +12,7 @@ from ee.core.extract import EEExtract
from ee.core.mysql import EEMysql
from ee.core.addswap import EESwap
from ee.core.git import EEGit
from ee.core.checkfqdn import check_fqdn
from pynginxconfig import NginxConfig
from ee.core.services import EEService
import random
@ -44,6 +45,8 @@ class EEStackController(CementBaseController):
dict(help='Install admin tools stack', action='store_true')),
(['--mail'],
dict(help='Install mail server stack', action='store_true')),
(['--mailscanner'],
dict(help='Install mail scanner stack', action='store_true')),
(['--nginx'],
dict(help='Install Nginx stack', action='store_true')),
(['--php'],
@ -82,7 +85,8 @@ class EEStackController(CementBaseController):
EERepo.add(self, repo_url=EEVariables.ee_mysql_repo)
Log.debug(self, 'Adding key for {0}'
.format(EEVariables.ee_mysql_repo))
EERepo.add_key(self, '1C4CBDCDCD2EFD2A')
EERepo.add_key(self, '1C4CBDCDCD2EFD2A',
keyserver="subkeys.pgp.net")
chars = ''.join(random.sample(string.ascii_letters, 8))
Log.info(self, "Pre-seeding MySQL")
EEShellExec.cmd_exec(self, "echo \"percona-server-server-5.6 "
@ -466,13 +470,26 @@ class EEStackController(CementBaseController):
"/dovecot.pem")
# Custom Dovecot configuration by EasyEngine
data = dict()
data = dict(email=EEVariables.ee_email)
Log.debug(self, "Writting configuration into file"
"/etc/dovecot/conf.d/99-ee.conf ")
ee_dovecot = open('/etc/dovecot/conf.d/99-ee.conf', 'w')
self.app.render((data), 'dovecot.mustache', out=ee_dovecot)
ee_dovecot.close()
EEShellExec.cmd_exec(self, "sed -i \"s/\\!include "
"auth-system.conf.ext/#\\!include "
"auth-system.conf.ext/\" "
"/etc/dovecot/conf.d/10-auth.conf")
EEShellExec.cmd_exec(self, "sed -i \"s\'/etc/dovecot/"
"dovecot.pem\'/etc/ssl/certs/dovecot.pem"
"\'\" /etc/dovecot/conf.d/10-ssl.conf")
EEShellExec.cmd_exec(self, "sed -i \"s\'/etc/dovecot/"
"private/dovecot.pem\'/etc/ssl/private"
"/dovecot.pem\'\" /etc/dovecot/conf.d/"
"10-ssl.conf")
# Custom Postfix configuration needed with Dovecot
# Changes in master.cf
# TODO: Find alternative for sed in Python
@ -514,14 +531,14 @@ class EEStackController(CementBaseController):
"= static:5000\"")
EEShellExec.cmd_exec(self, "postconf -e \""
" virtual_mailbox_domains = "
" mysql:/etc/postfix/mysql/virtual_"
" domains_maps.cf\"")
"mysql:/etc/postfix/mysql/virtual_"
"domains_maps.cf\"")
EEShellExec.cmd_exec(self, "postconf -e \"virtual_mailbox_maps"
" = mysql:/etc/postfix/mysql/virtual_"
"mailbox_maps.cf\"")
EEShellExec.cmd_exec(self, "postconf -e \"virtual_alias_maps "
"= mysql:/etc/postfix/mysql/virtual_"
" alias_maps.cf\"")
"alias_maps.cf\"")
EEShellExec.cmd_exec(self, "openssl req -new -x509 -days "
" 3650 -nodes -subj /commonName="
"{HOSTNAME}/emailAddress={EMAIL}"
@ -534,7 +551,7 @@ class EEStackController(CementBaseController):
EEShellExec.cmd_exec(self, "postconf -e \"smtpd_tls_cert_file "
"= /etc/ssl/certs/postfix.pem\"")
EEShellExec.cmd_exec(self, "postconf -e \"smtpd_tls_key_file "
" = /etc/ssl/private/postfix.pem\"")
"= /etc/ssl/private/postfix.pem\"")
# Sieve configuration
if not os.path.exists('/var/lib/dovecot/sieve/'):
@ -561,7 +578,7 @@ class EEStackController(CementBaseController):
"default.sieve")
EEGit.add(self, ["/etc/postfix", "/etc/dovecot"],
msg="Installed mail server")
EEService.reload_service(self, 'dovecot')
EEService.restart_service(self, 'dovecot')
EEService.reload_service(self, 'postfix')
if set(EEVariables.ee_mailscanner).issubset(set(apt_packages)):
@ -575,6 +592,20 @@ class EEStackController(CementBaseController):
out=ee_amavis)
ee_amavis.close()
# Amavis ViMbadmin configuration
if os.path.isfile("/etc/postfix/mysql/virtual_alias_maps.cf"):
vm_host = os.popen("grep hosts /etc/postfix/mysql/virtual_"
"alias_maps.cf | awk \'{ print $3 }\' |"
" tr -d '\\n'").read()
vm_pass = os.popen("grep password /etc/postfix/mysql/"
"virtual_alias_maps.cf | awk \'{ print "
"$3 }\' | tr -d '\\n'").read()
data = dict(host=vm_host, password=vm_pass)
vm_config = open('/etc/amavis/conf.d/50-user', 'w')
self.app.render((data), '50-user.mustache', out=vm_config)
vm_config.close()
# Amavis postfix configuration
EEShellExec.cmd_exec(self, "postconf -e \"content_filter = "
"smtp-amavis:[127.0.0.1]:10024\"")
@ -598,7 +629,7 @@ class EEStackController(CementBaseController):
Log.debug(self, "Restarting clamav-daemon service")
EEShellExec.cmd_exec(self, "service clamav-daemon restart")
EEGit.add(self, ["/etc/amavis"], msg="Adding Amvis into Git")
EEService.reload_service(self, 'dovecot')
EEService.restart_service(self, 'dovecot')
EEService.reload_service(self, 'postfix')
EEService.reload_service(self, 'amavis')
@ -776,7 +807,13 @@ class EEStackController(CementBaseController):
Log.debug(self, "Creating directory "
"/etc/postfix/mysql/")
os.makedirs('/etc/postfix/mysql/')
data = dict(password=vm_passwd, host=EEVariables.ee_mysql)
if EEVariables.ee_mysql_host is "localhost":
data = dict(password=vm_passwd, host="127.0.0.1")
else:
data = dict(password=vm_passwd,
host=EEVariables.ee_mysql_host)
vm_config = open('/etc/postfix/mysql/virtual_alias_maps.cf',
'w')
self.app.render((data), 'virtual_alias_maps.mustache',
@ -817,7 +854,7 @@ class EEStackController(CementBaseController):
self.app.render((data), '50-user.mustache',
out=vm_config)
vm_config.close()
EEService.reload_service(self, 'dovecot')
EEService.restart_service(self, 'dovecot')
EEService.reload_service(self, 'nginx')
EEService.reload_service(self, 'php5-fpm')
self.msg = (self.msg + ["Configure ViMbAdmin:\thttps://{0}:"
@ -870,8 +907,8 @@ class EEStackController(CementBaseController):
EEShellExec.cmd_exec(self, "bash -c \"sed -i \\\"s:\$config\["
"\'plugins\'\] "
"= array(:\$config\['plugins'\] = "
"array(\n\'sieverules\',:\\\" /var/www"
"/roundcubemail/htdocs/config"
"array(\\n \'sieverules\',:\\\" "
"/var/www/roundcubemail/htdocs/config"
"/config.inc.php\"")
EEShellExec.cmd_exec(self, "echo \"\$config['sieverules_port']"
"=4190;\" >> /var/www/roundcubemail"
@ -929,7 +966,8 @@ class EEStackController(CementBaseController):
(not self.app.pargs.php) and (not self.app.pargs.mysql) and
(not self.app.pargs.postfix) and (not self.app.pargs.wpcli) and
(not self.app.pargs.phpmyadmin) and
(not self.app.pargs.adminer) and (not self.app.pargs.utils)):
(not self.app.pargs.adminer) and (not self.app.pargs.utils) and
(not self.app.pargs.mailscanner)):
self.app.pargs.web = True
if self.app.pargs.web:
@ -956,6 +994,8 @@ class EEStackController(CementBaseController):
self.app.pargs.postfix = True
if not EEAptGet.is_installed(self, 'dovecot-core'):
check_fqdn(self,
os.popen("hostname -f | tr -d '\n'").read())
Log.debug(self, "Setting apt_packages variable for mail")
apt_packages = apt_packages + EEVariables.ee_mail
packages = packages + [["https://github.com/opensolutions/"
@ -971,8 +1011,11 @@ class EEStackController(CementBaseController):
"Roundcube"]]
if EEVariables.ee_ram > 1024:
apt_packages = (apt_packages +
EEVariables.ee_mailscanner)
self.app.pargs.mailscanner = True
else:
Log.info(self, "System RAM is less than 1GB\nMail "
"scanner packages are not going to install"
" automatically")
else:
Log.info(self, "Mail server is already installed")
@ -1031,6 +1074,9 @@ class EEStackController(CementBaseController):
"htdocs/db/adminer/index.php",
"Adminer"]]
if self.app.pargs.mailscanner:
apt_packages = (apt_packages + EEVariables.ee_mailscanner)
if self.app.pargs.utils:
Log.debug(self, "Setting packages variable for utils")
packages = packages + [["http://phpmemcacheadmin.googlecode"
@ -1130,6 +1176,9 @@ class EEStackController(CementBaseController):
EEMysql.execute(self, "drop database IF EXISTS vimbadmin")
EEMysql.execute(self, "drop database IF EXISTS roundcubemail")
if self.app.pargs.mailscanner:
apt_packages = (apt_packages + EEVariables.ee_mailscanner)
if self.app.pargs.nginx:
Log.debug(self, "Removing apt_packages variable of Nginx")
apt_packages = apt_packages + EEVariables.ee_nginx
@ -1206,6 +1255,9 @@ class EEStackController(CementBaseController):
EEMysql.execute(self, "drop database IF EXISTS vimbadmin")
EEMysql.execute(self, "drop database IF EXISTS roundcubemail")
if self.app.pargs.mailscanner:
apt_packages = (apt_packages + EEVariables.ee_mailscanner)
if self.app.pargs.nginx:
Log.debug(self, "Purge apt_packages variable of Nginx")
apt_packages = apt_packages + EEVariables.ee_nginx

2
ee/cli/templates/50-user.mustache

@ -8,7 +8,7 @@ $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=127.0.0.1;port=3306',
['DBI:mysql:database=vimbadmin;host={{host}};port=3306',
'vimbadmin',
'{{password}}']);

4
ee/cli/templates/vimbadmin.mustache

@ -1,5 +1,5 @@
;; This file is licenesed Under GNU GENERAL PUBLIC LICENSE Version 3
;; © Copyright 2011 - 2014 Open Source Solutions Limited, Dublin, Ireland.
;; © Copyright 2011 - 2014 Open Source Solutions Limited, Dublin, Ireland.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; ViMbAdmin :: Virtual Mailbox Admin
@ -129,7 +129,7 @@ defaults.mailbox.gid = 5000
;
; http://wiki2.dovecot.org/VirtualUsers/Home
defaults.mailbox.maildir = "maildir:/var/vmail/%d/%u""
defaults.mailbox.maildir = "maildir:/var/vmail/%d/%u"
defaults.mailbox.homedir = "/var/vmail/"
;minimum mailbox password length

11
ee/core/apt_repo.py

@ -48,11 +48,12 @@ class EERepo():
"--remove '{ppa_name}'"
.format(ppa_name=repo_url))
def add_key(keyids, keyserver=None):
def add_key(self, keyids, keyserver=None):
if keyserver is None:
EEShellExec.cmd_exec("gpg --keyserver {serv}"
.format(serv=(keyserver
or "hkp://keys.gnupg.net"))
EEShellExec.cmd_exec(self, "gpg --keyserver {serv}"
.format(serv=(keyserver or
"hkp://keys.gnupg.net"))
+ " --recv-keys {key}".format(key=keyids))
EEShellExec.cmd_exec("gpg -a --export --armor {0}".format(keyids)
EEShellExec.cmd_exec(self, "gpg -a --export --armor {0}"
.format(keyids)
+ " | apt-key add - ")

16
ee/core/aptget.py

@ -50,15 +50,25 @@ class EEAptGet():
#apt_cache.close()
return False
else:
pkg.mark_install()
try:
print(pkg.name)
pkg.mark_install()
except Exception as e:
Log.debug(self, str(e))
Log.error(self, str(e))
try:
#apt_pkg.PkgSystemUnLock()
result = apt_cache.commit()
#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))
else:
#apt_cache.close()
Log.error(self, 'Unknown package selected (' +
@ -85,6 +95,7 @@ class EEAptGet():
return False
else:
try:
print(pkg.name)
pkg.mark_delete(purge)
except SystemError as e:
Log.debug(self, 'SystemError: ' + str(e))
@ -97,6 +108,9 @@ class EEAptGet():
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()
else:
# apt_cache.close()

22
ee/core/checkfqdn.py

@ -0,0 +1,22 @@
from ee.core.shellexec import EEShellExec
from ee.core.variables import EEVariables
import os
def check_fqdn(self, ee_host):
#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)
Loading…
Cancel
Save