From ad525171c16746de04c6cce35dd0dcaff5e9fd8b Mon Sep 17 00:00:00 2001 From: harshadyeola Date: Tue, 2 Jun 2015 11:59:57 +0530 Subject: [PATCH] added webmailstack --- ee/cli/plugins/mailscannerstack.py | 2 +- ee/cli/plugins/mailstack.py | 303 +++++++ ee/cli/plugins/stack.py | 1324 +--------------------------- ee/core/download.py | 1 + 4 files changed, 306 insertions(+), 1324 deletions(-) diff --git a/ee/cli/plugins/mailscannerstack.py b/ee/cli/plugins/mailscannerstack.py index 41d9c3e1..3f9b91be 100644 --- a/ee/cli/plugins/mailscannerstack.py +++ b/ee/cli/plugins/mailscannerstack.py @@ -57,7 +57,7 @@ class EEMailScannerStack(EEStack): # Set up Custom amavis configuration data = dict() self.log.debug(self, "Configuring file /etc/amavis/conf.d" - "/15-content_filter_mode") + "/15-content_filter_mode") ee_amavis = open('/etc/amavis/conf.d/15-content_filter_mode', encoding='utf-8', mode='w') self.app.render((data), '15-content_filter_mode.mustache', diff --git a/ee/cli/plugins/mailstack.py b/ee/cli/plugins/mailstack.py index c5aab4cc..d3b45dc6 100644 --- a/ee/cli/plugins/mailstack.py +++ b/ee/cli/plugins/mailstack.py @@ -235,6 +235,7 @@ class EEMailStack(EEStack): self._pre_install_stack() super(EEMailStack, self).install_stack() self._post_install_stack() + EEWebmailAdmin(self).install_stack() def remove_stack(self): """ @@ -246,3 +247,305 @@ class EEMailStack(EEStack): def purge_stack(self): self.log.info("Purging MAIL stack, please wait...") super(EEMailStack, self).purge_stack() + + +import string +import shutil +from ee.core.download import EEDownload +from ee.core.extract import EEExtract +from ee.core.mysql import EEMysql + +class EEWebmailAdmin (EEStack): + """ + EasyEngine Web Mail stack + VimbAdmin + Roundcube + """ + packages_name = { + 'Vimbadmin': "https://github.com/opensolutions/ViMbAdmin/archive/{0}.tar.gz".format(EEVariables.ee_vimbadmin), + 'Roundcube': "https://github.com/roundcube/roundcubemail/releases/download/{0}/roundcubemail-{0}.tar.gz".format(EEVariables.ee_roundcube) + } + app = app + log = app.log + + def __init__(self, package_name=None, package_url=None): + """ + Initialize packages list in stack + pkgs_name : list of packages to be intialized for operations + in stack + package_url : list of urls from where packages to be fetched + """ + + self.packages_name = self._get_stack() + + super(EEWebmailAdmin, self).__init__(self.packages_name) + + def _get_stack(self): + return EEWebmailAdmin.packages_name + + def _get_package_url(self, package_name): + return self.packages_name[package_name] + + def _get_package_path(self, package): + return "/tmp/{0}.tar.gz".format(package) + + def _requirement_check(self): + """ + Check if requirements for this EEWebmailAdmin stack are fullfilled. + """ + pass + + def _pre_install(self): + """ + """ + for pkg in self.packages_name: + print([self._get_package_url(pkg), '/tmp/{0}.tar.gz'.format(pkg), pkg]) + print() + EEDownload.download(self, [[self._get_package_url(pkg), '/tmp/{0}.tar.gz'.format(pkg), pkg]]) + + def _post_install(self): + """ + """ + pass + + def _install_vimbadmin(self): + """ + + """ + self.log.debug(self, "Extracting ViMbAdmin.tar.gz to " + "location /tmp/") + EEExtract.extract(self, self._get_package_path('Vimbadmin'), '/tmp/') + if not os.path.exists('{0}22222/htdocs/' + .format(EEVariables.ee_webroot)): + self.log.debug(self, "Creating directory " + "{0}22222/htdocs/" + .format(EEVariables.ee_webroot)) + os.makedirs('{0}22222/htdocs/' + .format(EEVariables.ee_webroot)) + shutil.move('/tmp/ViMbAdmin-{0}/' + .format(EEVariables.ee_vimbadmin), + '{0}22222/htdocs/vimbadmin/' + .format(EEVariables.ee_webroot)) + + # Donwload composer and install ViMbAdmin + self.log.debug(self, "Downloading composer " + "https://getcomposer.org/installer | php ") + try: + EEShellExec.cmd_exec(self, "cd {0}22222/htdocs" + "/vimbadmin; curl" + " -sS https://getcomposer.org/" + "installer |" + " php".format(EEVariables.ee_webroot)) + self.log.debug(self, "Installating of composer") + EEShellExec.cmd_exec(self, "cd {0}22222/htdocs" + "/vimbadmin && " + "php composer.phar install " + "--prefer-dist" + " --no-dev && rm -f {0}22222/htdocs" + "/vimbadmin/composer.phar" + .format(EEVariables.ee_webroot)) + except CommandExecutionError as e: + raise SiteError("Failed to setup ViMbAdmin") + + # Configure vimbadmin database + vm_passwd = ''.join(random.sample(string.ascii_letters, 8)) + self.log.debug(self, "Creating vimbadmin database if not exist") + EEMysql.execute(self, "create database if not exists" + " vimbadmin") + self.log.debug(self, " grant all privileges on `vimbadmin`.* to" + " `vimbadmin`@`{0}` IDENTIFIED BY" + " ' '".format(app.config.get('mysql', + 'grant-host'))) + EEMysql.execute(self, "grant all privileges on `vimbadmin`.* " + " to `vimbadmin`@`{0}` IDENTIFIED BY" + " '{1}'".format(app.config.get('mysql', + 'grant-host'), vm_passwd), + errormsg="Cannot grant " + "user privileges", log=False) + vm_salt = (''.join(random.sample(string.ascii_letters + + string.ascii_letters, 64))) + + # Custom Vimbadmin configuration by EasyEngine + data = dict(salt=vm_salt, host=EEVariables.ee_mysql_host, + password=vm_passwd, + php_user=EEVariables.ee_php_user) + self.log.debug(self, 'Writting the ViMbAdmin configuration to ' + 'file {0}22222/htdocs/vimbadmin/application/' + 'configs/application.ini' + .format(EEVariables.ee_webroot)) + ee_vmb = open('{0}22222/htdocs/vimbadmin/application/' + 'configs/application.ini' + .format(EEVariables.ee_webroot), + encoding='utf-8', mode='w') + app.render((data), 'vimbadmin.mustache', + out=ee_vmb) + ee_vmb.close() + + shutil.copyfile("{0}22222/htdocs/vimbadmin/public/" + ".htaccess.dist" + .format(EEVariables.ee_webroot), + "{0}22222/htdocs/vimbadmin/public/" + ".htaccess".format(EEVariables.ee_webroot)) + self.log.debug(self, "Executing command " + "{0}22222/htdocs/vimbadmin/bin" + "/doctrine2-cli.php orm:schema-tool:" + "create".format(EEVariables.ee_webroot)) + try: + EEShellExec.cmd_exec(self, "{0}22222/htdocs/vimbadmin" + "/bin/doctrine2-cli.php " + "orm:schema-tool:create" + .format(EEVariables.ee_webroot)) + except CommandExecutionError as e: + raise SiteError("Unable to create ViMbAdmin schema") + + EEFileUtils.chown(self, '{0}22222' + .format(EEVariables.ee_webroot), + EEVariables.ee_php_user, + EEVariables.ee_php_user, + recursive=True) + + # Copy Dovecot and Postfix templates which are depednet on + # Vimbadmin + + if not os.path.exists('/etc/postfix/mysql/'): + self.log.debug(self, "Creating directory " + "/etc/postfix/mysql/") + os.makedirs('/etc/postfix/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', + encoding='utf-8', mode='w') + app.render((data), 'virtual_alias_maps.mustache', + out=vm_config) + vm_config.close() + + self.log.debug(self, "Writting configuration to " + "/etc/postfix/mysql" + "/virtual_domains_maps.cf file") + vm_config = open('/etc/postfix/mysql/virtual_domains_maps.cf', + encoding='utf-8', mode='w') + app.render((data), 'virtual_domains_maps.mustache', + out=vm_config) + vm_config.close() + + self.log.debug(self, "Writting configuration to " + "/etc/postfix/mysql" + "/virtual_mailbox_maps.cf file") + vm_config = open('/etc/postfix/mysql/virtual_mailbox_maps.cf', + encoding='utf-8', mode='w') + app.render((data), 'virtual_mailbox_maps.mustache', + out=vm_config) + vm_config.close() + + self.log.debug(self, "Writting configration" + " to /etc/dovecot/dovecot-sql.conf.ext file ") + vm_config = open('/etc/dovecot/dovecot-sql.conf.ext', + encoding='utf-8', mode='w') + app.render((data), 'dovecot-sql-conf.mustache', + out=vm_config) + vm_config.close() + + def _install_roundcube(self): + """ + Install and configure roundcube for mailstack + """ + # Extract RoundCubemail + self.log.debug(self, "Extracting file /tmp/roundcube.tar.gz " + "to location /tmp/ ") + EEExtract.extract(self, self._get_package_path('Roundcube'), '/tmp/') + if not os.path.exists('{0}roundcubemail' + .format(EEVariables.ee_webroot)): + self.log.debug(self, "Creating new directory " + " {0}roundcubemail/" + .format(EEVariables.ee_webroot)) + os.makedirs('{0}roundcubemail/' + .format(EEVariables.ee_webroot)) + shutil.move('/tmp/roundcubemail-{0}/' + .format(EEVariables.ee_roundcube), + '{0}roundcubemail/htdocs' + .format(EEVariables.ee_webroot)) + + # Install Roundcube depednet pear packages + EEShellExec.cmd_exec(self, "pear install Mail_Mime Net_SMTP" + " Mail_mimeDecode Net_IDNA2-beta " + "Auth_SASL Net_Sieve Crypt_GPG") + + # Configure roundcube database + rc_passwd = ''.join(random.sample(string.ascii_letters, 8)) + self.log.debug(self, "Creating Database roundcubemail") + EEMysql.execute(self, "create database if not exists " + " roundcubemail") + self.log.debug(self, "grant all privileges" + " on `roundcubemail`.* to " + " `roundcube`@`{0}` IDENTIFIED BY " + "' '".format(app.config.get( + 'mysql', 'grant-host'))) + EEMysql.execute(self, "grant all privileges" + " on `roundcubemail`.* to " + " `roundcube`@`{0}` IDENTIFIED BY " + "'{1}'".format(app.config.get( + 'mysql', 'grant-host'), + rc_passwd)) + EEShellExec.cmd_exec(self, "mysql roundcubemail < {0}" + "roundcubemail/htdocs/SQL/mysql" + ".initial.sql" + .format(EEVariables.ee_webroot)) + + shutil.copyfile("{0}roundcubemail/htdocs/config/" + "config.inc.php.sample" + .format(EEVariables.ee_webroot), + "{0}roundcubemail/htdocs/config/" + "config.inc.php" + .format(EEVariables.ee_webroot)) + EEShellExec.cmd_exec(self, "sed -i \"s\'mysql://roundcube:" + "pass@localhost/roundcubemail\'mysql://" + "roundcube:{0}@{1}/" + "roundcubemail\'\" {2}roundcubemail" + "/htdocs/config/config." + "inc.php" + .format(rc_passwd, + EEVariables.ee_mysql_host, + EEVariables.ee_webroot)) + + # Sieve plugin configuration in roundcube + EEShellExec.cmd_exec(self, "bash -c \"sed -i \\\"s:\$config\[" + "\'plugins\'\] " + "= array(:\$config\['plugins'\] = " + "array(\\n \'sieverules\',:\\\" " + "{0}roundcubemail/htdocs/config" + .format(EEVariables.ee_webroot) + + "/config.inc.php\"") + EEShellExec.cmd_exec(self, "echo \"\$config['sieverules_port']" + "=4190;\" >> {0}roundcubemail" + .format(EEVariables.ee_webroot) + + "/htdocs/config/config.inc.php") + + data = dict(site_name='webmail', www_domain='webmail', + static=False, + basic=True, wp=False, w3tc=False, wpfc=False, + wpsc=False, multisite=False, wpsubdir=False, + webroot=EEVariables.ee_webroot, ee_db_name='', + ee_db_user='', ee_db_pass='', ee_db_host='', + rc=True) + + self.log.debug(self, 'Writting the nginx configuration for ' + 'RoundCubemail') + ee_rc = open('/etc/nginx/sites-available/webmail', + encoding='utf-8', mode='w') + app.render((data), 'virtualconf.mustache', + out=ee_rc) + ee_rc.close() + + + def install_stack(self): + """ + """ + self._pre_install() + self._install_vimbadmin() + self._install_roundcube() + + diff --git a/ee/cli/plugins/stack.py b/ee/cli/plugins/stack.py index 74b29dec..60bfa9c9 100644 --- a/ee/cli/plugins/stack.py +++ b/ee/cli/plugins/stack.py @@ -31,7 +31,6 @@ from ee.cli.plugins.stack_migrate import EEStackMigrateController from ee.cli.plugins.stack_upgrade import EEStackUpgradeController from ee.core.logging import Log - def ee_stack_hook(app): # do something with the ``app`` object here. pass @@ -83,1328 +82,7 @@ class EEStackController(CementBaseController): self.app.args.print_help() EEMailStack(self).purged_stack() - @expose(hide=True) - def pre_pref(self, apt_packages): - """Pre settings to do before installation packages""" - if set(EEVariables.ee_postfix).issubset(set(apt_packages)): - Log.debug(self, "Pre-seeding Postfix") - try: - EEShellExec.cmd_exec(self, "echo \"postfix postfix" - "/main_mailer_type string \'Internet Site" - "\'\"" - " | debconf-set-selections") - EEShellExec.cmd_exec(self, "echo \"postfix postfix/mailname" - " string $(hostname -f)\" | " - "debconf-set-selections") - except CommandExecutionError as e: - Log.error(self, "Failed to intialize postfix package") - - if set(EEVariables.ee_mysql).issubset(set(apt_packages)): - Log.info(self, "Adding repository for MySQL, please wait...") - mysql_pref = ("Package: *\nPin: origin mirror.aarnet.edu.au" - "\nPin-Priority: 1000\n") - with open('/etc/apt/preferences.d/' - 'MariaDB.pref', 'w') as mysql_pref_file: - mysql_pref_file.write(mysql_pref) - if EEVariables.ee_platform_codename != 'jessie': - 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, '0xcbcb082a1bb943db', - keyserver="keyserver.ubuntu.com") - chars = ''.join(random.sample(string.ascii_letters, 8)) - Log.debug(self, "Pre-seeding MySQL") - Log.debug(self, "echo \"mariadb-server-10.0 " - "mysql-server/root_password " - "password \" | " - "debconf-set-selections") - try: - EEShellExec.cmd_exec(self, "echo \"mariadb-server-10.0 " - "mysql-server/root_password " - "password {chars}\" | " - "debconf-set-selections" - .format(chars=chars), - log=False) - except CommandExecutionError as e: - Log.error("Failed to initialize MySQL package") - - Log.debug(self, "echo \"mariadb-server-10.0 " - "mysql-server/root_password_again " - "password \" | " - "debconf-set-selections") - try: - EEShellExec.cmd_exec(self, "echo \"mariadb-server-10.0 " - "mysql-server/root_password_again " - "password {chars}\" | " - "debconf-set-selections" - .format(chars=chars), - log=False) - except CommandExecutionError as e: - Log.error("Failed to initialize MySQL package") - - mysql_config = """ - [client] - user = root - password = {chars} - """.format(chars=chars) - config = configparser.ConfigParser() - config.read_string(mysql_config) - Log.debug(self, 'Writting configuration into MySQL file') - with open(os.path.expanduser("~")+'/.my.cnf', encoding='utf-8', - mode='w') as configfile: - config.write(configfile) - - if set(EEVariables.ee_nginx).issubset(set(apt_packages)): - Log.info(self, "Adding repository for NGINX, please wait...") - if EEVariables.ee_platform_distro == 'debian': - Log.debug(self, 'Adding Dotdeb/nginx GPG key') - EERepo.add(self, repo_url=EEVariables.ee_nginx_repo) - else: - EERepo.add(self, ppa=EEVariables.ee_nginx_repo) - Log.debug(self, 'Adding ppa of Nginx') - - if set(EEVariables.ee_php).issubset(set(apt_packages)): - Log.info(self, "Adding repository for PHP, please wait...") - # Add repository for php - if EEVariables.ee_platform_distro == 'debian': - if EEVariables.ee_platform_codename != 'jessie': - Log.debug(self, 'Adding repo_url of php for debian') - EERepo.add(self, repo_url=EEVariables.ee_php_repo) - Log.debug(self, 'Adding Dotdeb/php GPG key') - EERepo.add_key(self, '89DF5277') - else: - Log.debug(self, 'Adding ppa for PHP') - EERepo.add(self, ppa=EEVariables.ee_php_repo) - - if set(EEVariables.ee_hhvm).issubset(set(apt_packages)): - Log.info(self, "Adding repository for HHVM, please wait...") - if EEVariables.ee_platform_codename == 'precise': - Log.debug(self, 'Adding PPA for Boost') - EERepo.add(self, ppa=EEVariables.ee_boost_repo) - Log.debug(self, 'Adding ppa repo for HHVM') - EERepo.add(self, repo_url=EEVariables.ee_hhvm_repo) - Log.debug(self, 'Adding HHVM GPG Key') - EERepo.add_key(self, '0x5a16e7281be7a449') - - if set(EEVariables.ee_mail).issubset(set(apt_packages)): - Log.debug(self, 'Executing the command debconf-set-selections.') - try: - EEShellExec.cmd_exec(self, "echo \"dovecot-core dovecot-core/" - "create-ssl-cert boolean yes\" " - "| debconf-set-selections") - EEShellExec.cmd_exec(self, "echo \"dovecot-core dovecot-core" - "/ssl-cert-name string $(hostname -f)\"" - " | debconf-set-selections") - except CommandExecutionError as e: - Log.error("Failed to initialize dovecot packages") - - @expose(hide=True) - def post_pref(self, apt_packages, packages): - """Post activity after installation of packages""" - if len(apt_packages): - if set(EEVariables.ee_postfix).issubset(set(apt_packages)): - EEGit.add(self, ["/etc/postfix"], - msg="Adding Postfix into Git") - EEService.reload_service(self, 'postfix') - - if set(EEVariables.ee_nginx).issubset(set(apt_packages)): - if ((not EEShellExec.cmd_exec(self, "grep -q -Hr EasyEngine " - "/etc/nginx")) and os.path.isfile('/etc/nginx/nginx.conf')): - nc = NginxConfig() - Log.debug(self, 'Loading file /etc/nginx/nginx.conf ') - nc.loadf('/etc/nginx/nginx.conf') - nc.set('worker_processes', 'auto') - nc.append(('worker_rlimit_nofile', '100000'), position=2) - nc.remove(('events', '')) - nc.append({'name': 'events', 'param': '', 'value': - [('worker_connections', '4096'), - ('multi_accept', 'on')]}, position=4) - nc.set([('http',), 'keepalive_timeout'], '30') - Log.debug(self, "Writting nginx configuration to " - "file /etc/nginx/nginx.conf ") - nc.savef('/etc/nginx/nginx.conf') - - # Custom Nginx configuration by EasyEngine - if EEVariables.ee_platform_distro == 'ubuntu': - data = dict(version=EEVariables.ee_version, - Ubuntu=True) - else: - data = dict(version=EEVariables.ee_version, - Debian=True) - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/conf.d/ee-nginx.conf ') - ee_nginx = open('/etc/nginx/conf.d/ee-nginx.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'nginx-core.mustache', - out=ee_nginx) - ee_nginx.close() - - data = dict() - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/conf.d/blockips.conf') - ee_nginx = open('/etc/nginx/conf.d/blockips.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'blockips.mustache', out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/conf.d/fastcgi.conf') - ee_nginx = open('/etc/nginx/conf.d/fastcgi.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'fastcgi.mustache', out=ee_nginx) - ee_nginx.close() - - data = dict(php="9000", debug="9001", hhvm="8000") - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/conf.d/upstream.conf ') - ee_nginx = open('/etc/nginx/conf.d/upstream.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'upstream.mustache', out=ee_nginx) - ee_nginx.close() - - # Setup Nginx common directory - if not os.path.exists('/etc/nginx/common'): - Log.debug(self, 'Creating directory' - '/etc/nginx/common') - os.makedirs('/etc/nginx/common') - - data = dict(webroot=EEVariables.ee_webroot) - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/acl.conf') - ee_nginx = open('/etc/nginx/common/acl.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'acl.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/locations.conf') - ee_nginx = open('/etc/nginx/common/locations.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'locations.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/php-hhvm.conf') - ee_nginx = open('/etc/nginx/common/php-hhvm.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'php-hhvm.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/w3tc-hhvm.conf') - ee_nginx = open('/etc/nginx/common/w3tc-hhvm.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'w3tc-hhvm.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/wpfc-hhvm.conf') - ee_nginx = open('/etc/nginx/common/wpfc-hhvm.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'wpfc-hhvm.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/wpsc-hhvm.conf') - ee_nginx = open('/etc/nginx/common/wpsc-hhvm.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'wpsc-hhvm.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/php.conf') - ee_nginx = open('/etc/nginx/common/php.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'php.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/w3tc.conf') - ee_nginx = open('/etc/nginx/common/w3tc.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'w3tc.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/wpcommon.conf') - ee_nginx = open('/etc/nginx/common/wpcommon.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'wpcommon.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/wpfc.conf') - ee_nginx = open('/etc/nginx/common/wpfc.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'wpfc.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/wpsc.conf') - ee_nginx = open('/etc/nginx/common/wpsc.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'wpsc.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/wpsubdir.conf') - ee_nginx = open('/etc/nginx/common/wpsubdir.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'wpsubdir.mustache', - out=ee_nginx) - ee_nginx.close() - - # Fix whitescreen of death beacuse of missing value - # fastcgi_param SCRIPT_FILENAME $request_filename; in file - # /etc/nginx/fastcgi_params - - if not EEFileUtils.grep(self, '/etc/nginx/fastcgi_params', - 'SCRIPT_FILENAME'): - with open('/etc/nginx/fastcgi_params', - encoding='utf-8', mode='a') as ee_nginx: - ee_nginx.write('fastcgi_param \tSCRIPT_FILENAME ' - '\t$request_filename;\n') - - # Pagespeed configuration - Log.debug(self, 'Writting the Pagespeed Global ' - 'configuration to file /etc/nginx/conf.d/' - 'pagespeed.conf') - ee_nginx = open('/etc/nginx/conf.d/pagespeed.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'pagespeed-global.mustache', - out=ee_nginx) - ee_nginx.close() - - # 22222 port settings - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/sites-available/' - '22222') - ee_nginx = open('/etc/nginx/sites-available/22222', - encoding='utf-8', mode='w') - self.app.render((data), '22222.mustache', - out=ee_nginx) - ee_nginx.close() - - passwd = ''.join([random.choice - (string.ascii_letters + string.digits) - for n in range(6)]) - try: - EEShellExec.cmd_exec(self, "printf \"easyengine:" - "$(openssl passwd -crypt " - "{password} 2> /dev/null)\n\"" - "> /etc/nginx/htpasswd-ee " - "2>/dev/null" - .format(password=passwd)) - except CommandExecutionError as e: - Log.error(self, "Failed to save HTTP Auth") - - # Create Symbolic link for 22222 - EEFileUtils.create_symlink(self, ['/etc/nginx/' - 'sites-available/' - '22222', - '/etc/nginx/' - 'sites-enabled/' - '22222']) - # Create log and cert folder and softlinks - if not os.path.exists('{0}22222/logs' - .format(EEVariables.ee_webroot)): - Log.debug(self, "Creating directory " - "{0}22222/logs " - .format(EEVariables.ee_webroot)) - os.makedirs('{0}22222/logs' - .format(EEVariables.ee_webroot)) - - if not os.path.exists('{0}22222/cert' - .format(EEVariables.ee_webroot)): - Log.debug(self, "Creating directory " - "{0}22222/cert" - .format(EEVariables.ee_webroot)) - os.makedirs('{0}22222/cert' - .format(EEVariables.ee_webroot)) - - EEFileUtils.create_symlink(self, ['/var/log/nginx/' - '22222.access.log', - '{0}22222/' - 'logs/access.log' - .format(EEVariables.ee_webroot)] - ) - - EEFileUtils.create_symlink(self, ['/var/log/nginx/' - '22222.error.log', - '{0}22222/' - 'logs/error.log' - .format(EEVariables.ee_webroot)] - ) - - try: - EEShellExec.cmd_exec(self, "openssl genrsa -out " - "{0}22222/cert/22222.key 2048" - .format(EEVariables.ee_webroot)) - EEShellExec.cmd_exec(self, "openssl req -new -batch " - "-subj /commonName=127.0.0.1/ " - "-key {0}22222/cert/22222.key " - "-out {0}22222/cert/" - "22222.csr" - .format(EEVariables.ee_webroot)) - - EEFileUtils.mvfile(self, "{0}22222/cert/22222.key" - .format(EEVariables.ee_webroot), - "{0}22222/cert/" - "22222.key.org" - .format(EEVariables.ee_webroot)) - - EEShellExec.cmd_exec(self, "openssl rsa -in " - "{0}22222/cert/" - "22222.key.org -out " - "{0}22222/cert/22222.key" - .format(EEVariables.ee_webroot)) - - EEShellExec.cmd_exec(self, "openssl x509 -req -days " - "3652 -in {0}22222/cert/" - "22222.csr -signkey {0}" - "22222/cert/22222.key -out " - "{0}22222/cert/22222.crt" - .format(EEVariables.ee_webroot)) - - except CommandExecutionError as e: - self.log.error(self, "Failed to generate SSL for 22222") - - # Nginx Configation into GIT - EEGit.add(self, - ["/etc/nginx"], msg="Adding Nginx into Git") - EEService.reload_service(self, 'nginx') - self.msg = (self.msg + ["HTTP Auth User Name: easyengine"] - + ["HTTP Auth Password : {0}".format(passwd)]) - - if set(EEVariables.ee_hhvm).issubset(set(apt_packages)): - - EEShellExec.cmd_exec(self, "update-rc.d hhvm defaults") - - EEFileUtils.searchreplace(self, "/etc/hhvm/server.ini", - "9000", "8000") - EEFileUtils.searchreplace(self, "/etc/nginx/hhvm.conf", - "9000", "8000") - - with open("/etc/hhvm/php.ini", "a") as hhvm_file: - hhvm_file.write("hhvm.log.header = true\n" - "hhvm.log.natives_stack_trace = true\n" - "hhvm.mysql.socket = " - "/var/run/mysqld/mysqld.sock\n" - "hhvm.pdo_mysql.socket = " - "/var/run/mysqld/mysqld.sock\n" - "hhvm.mysqli.socket = " - "/var/run/mysqld/mysqld.sock\n") - - if os.path.isfile("/etc/nginx/conf.d/fastcgi.conf"): - if not EEFileUtils.grep(self, "/etc/nginx/conf.d/" - "fastcgi.conf", - "fastcgi_keep_conn"): - with open("/etc/nginx/conf.d/fastcgi.conf", - "a") as hhvm_file: - hhvm_file.write("fastcgi_keep_conn on;\n") - - if os.path.isfile("/etc/nginx/conf.d/upstream.conf"): - if not EEFileUtils.grep(self, "/etc/nginx/conf.d/" - "upstream.conf", - "hhvm"): - with open("/etc/nginx/conf.d/upstream.conf", - "a") as hhvm_file: - hhvm_file.write("upstream hhvm {\nserver " - "127.0.0.1:8000;\n" - "server 127.0.0.1:9000 backup;\n}" - "\n") - - EEGit.add(self, ["/etc/hhvm"], msg="Adding HHVM into Git") - EEService.restart_service(self, 'hhvm') - - if os.path.isfile("/etc/nginx/nginx.conf") and (not - os.path.isfile("/etc/nginx/common/php-hhvm.conf")): - - data = dict() - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/php-hhvm.conf') - ee_nginx = open('/etc/nginx/common/php-hhvm.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'php-hhvm.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/w3tc-hhvm.conf') - ee_nginx = open('/etc/nginx/common/w3tc-hhvm.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'w3tc-hhvm.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/wpfc-hhvm.conf') - ee_nginx = open('/etc/nginx/common/wpfc-hhvm.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'wpfc-hhvm.mustache', - out=ee_nginx) - ee_nginx.close() - - Log.debug(self, 'Writting the nginx configuration to ' - 'file /etc/nginx/common/wpsc-hhvm.conf') - ee_nginx = open('/etc/nginx/common/wpsc-hhvm.conf', - encoding='utf-8', mode='w') - self.app.render((data), 'wpsc-hhvm.mustache', - out=ee_nginx) - ee_nginx.close() - - if not EEService.reload_service(self, 'nginx'): - Log.error(self, "Failed to reload Nginx, please check " - "output of `nginx -t`") - - if set(EEVariables.ee_php).issubset(set(apt_packages)): - # Create log directories - if not os.path.exists('/var/log/php5/'): - Log.debug(self, 'Creating directory /var/log/php5/') - os.makedirs('/var/log/php5/') - - # For debian install xdebug - - if (EEVariables.ee_platform_distro == "debian" and - EEVariables.ee_platform_codename == 'wheezy'): - EEShellExec.cmd_exec(self, "pecl install xdebug") - - with open("/etc/php5/mods-available/xdebug.ini", - encoding='utf-8', mode='a') as myfile: - myfile.write("zend_extension=/usr/lib/php5/20131226/" - "xdebug.so\n") - - EEFileUtils.create_symlink(self, ["/etc/php5/" - "mods-available/xdebug.ini", - "/etc/php5/fpm/conf.d" - "/20-xedbug.ini"]) - - # Parse etc/php5/fpm/php.ini - config = configparser.ConfigParser() - Log.debug(self, "configuring php file /etc/php5/fpm/php.ini") - config.read('/etc/php5/fpm/php.ini') - config['PHP']['expose_php'] = 'Off' - config['PHP']['post_max_size'] = '100M' - config['PHP']['upload_max_filesize'] = '100M' - config['PHP']['max_execution_time'] = '300' - config['PHP']['date.timezone'] = EEVariables.ee_timezone - with open('/etc/php5/fpm/php.ini', - encoding='utf-8', mode='w') as configfile: - Log.debug(self, "Writting php configuration into " - "/etc/php5/fpm/php.ini") - config.write(configfile) - - # Prase /etc/php5/fpm/php-fpm.conf - config = configparser.ConfigParser() - Log.debug(self, "configuring php file" - "/etc/php5/fpm/php-fpm.conf") - config.read_file(codecs.open("/etc/php5/fpm/php-fpm.conf", - "r", "utf8")) - config['global']['error_log'] = '/var/log/php5/fpm.log' - config.remove_option('global', 'include') - config['global']['log_level'] = 'notice' - config['global']['include'] = '/etc/php5/fpm/pool.d/*.conf' - with codecs.open('/etc/php5/fpm/php-fpm.conf', - encoding='utf-8', mode='w') as configfile: - Log.debug(self, "writting php5 configuration into " - "/etc/php5/fpm/php-fpm.conf") - config.write(configfile) - - # Parse /etc/php5/fpm/pool.d/www.conf - config = configparser.ConfigParser() - config.read_file(codecs.open('/etc/php5/fpm/pool.d/www.conf', - "r", "utf8")) - config['www']['ping.path'] = '/ping' - config['www']['pm.status_path'] = '/status' - config['www']['pm.max_requests'] = '500' - config['www']['pm.max_children'] = '100' - config['www']['pm.start_servers'] = '20' - config['www']['pm.min_spare_servers'] = '10' - config['www']['pm.max_spare_servers'] = '30' - config['www']['request_terminate_timeout'] = '300' - config['www']['pm'] = 'ondemand' - config['www']['listen'] = '127.0.0.1:9000' - with codecs.open('/etc/php5/fpm/pool.d/www.conf', - encoding='utf-8', mode='w') as configfile: - Log.debug(self, "writting PHP5 configuration into " - "/etc/php5/fpm/pool.d/www.conf") - config.write(configfile) - - # Generate /etc/php5/fpm/pool.d/debug.conf - EEFileUtils.copyfile(self, "/etc/php5/fpm/pool.d/www.conf", - "/etc/php5/fpm/pool.d/debug.conf") - EEFileUtils.searchreplace(self, "/etc/php5/fpm/pool.d/" - "debug.conf", "[www]", "[debug]") - config = configparser.ConfigParser() - config.read('/etc/php5/fpm/pool.d/debug.conf') - config['debug']['listen'] = '127.0.0.1:9001' - config['debug']['rlimit_core'] = 'unlimited' - config['debug']['slowlog'] = '/var/log/php5/slow.log' - config['debug']['request_slowlog_timeout'] = '10s' - with open('/etc/php5/fpm/pool.d/debug.conf', - encoding='utf-8', mode='w') as confifile: - Log.debug(self, "writting PHP5 configuration into " - "/etc/php5/fpm/pool.d/debug.conf") - config.write(confifile) - - with open("/etc/php5/fpm/pool.d/debug.conf", - encoding='utf-8', mode='a') as myfile: - myfile.write("php_admin_value[xdebug.profiler_output_dir] " - "= /tmp/ \nphp_admin_value[xdebug.profiler_" - "output_name] = cachegrind.out.%p-%H-%R " - "\nphp_admin_flag[xdebug.profiler_enable" - "_trigger] = on \nphp_admin_flag[xdebug." - "profiler_enable] = off\n") - - # Disable xdebug - EEFileUtils.searchreplace(self, "/etc/php5/mods-available/" - "xdebug.ini", - "zend_extension", - ";zend_extension") - - # PHP and Debug pull configuration - if not os.path.exists('{0}22222/htdocs/fpm/status/' - .format(EEVariables.ee_webroot)): - Log.debug(self, 'Creating directory ' - '{0}22222/htdocs/fpm/status/ ' - .format(EEVariables.ee_webroot)) - os.makedirs('{0}22222/htdocs/fpm/status/' - .format(EEVariables.ee_webroot)) - open('{0}22222/htdocs/fpm/status/debug' - .format(EEVariables.ee_webroot), - encoding='utf-8', mode='a').close() - open('{0}22222/htdocs/fpm/status/php' - .format(EEVariables.ee_webroot), - encoding='utf-8', mode='a').close() - - # Write info.php - if not os.path.exists('{0}22222/htdocs/php/' - .format(EEVariables.ee_webroot)): - Log.debug(self, 'Creating directory ' - '{0}22222/htdocs/php/ ' - .format(EEVariables.ee_webroot)) - os.makedirs('{0}22222/htdocs/php' - .format(EEVariables.ee_webroot)) - - with open("{0}22222/htdocs/php/info.php" - .format(EEVariables.ee_webroot), - encoding='utf-8', mode='w') as myfile: - myfile.write("") - - EEFileUtils.chown(self, "{0}22222" - .format(EEVariables.ee_webroot), - EEVariables.ee_php_user, - EEVariables.ee_php_user, recursive=True) - - EEGit.add(self, ["/etc/php5"], msg="Adding PHP into Git") - EEService.restart_service(self, 'php5-fpm') - - if set(EEVariables.ee_mysql).issubset(set(apt_packages)): - # TODO: Currently we are using, we need to remove it in future - # config = configparser.ConfigParser() - # config.read('/etc/mysql/my.cnf') - # config['mysqld']['wait_timeout'] = 30 - # config['mysqld']['interactive_timeout'] = 60 - # config['mysqld']['performance_schema'] = 0 - # with open('/etc/mysql/my.cnf', 'w') as configfile: - # config.write(configfile) - if not os.path.isfile("/etc/mysql/my.cnf"): - config = ("[mysqld]\nwait_timeout = 30\n" - "interactive_timeout=60\nperformance_schema = 0" - "\nquery_cache_type = 1") - config_file = open("/etc/mysql/my.cnf", - encoding='utf-8', mode='w') - config_file.write(config) - config_file.close() - else: - try: - EEShellExec.cmd_exec(self, "sed -i \"/#max_conn" - "ections/a wait_timeout = 30 \\n" - "interactive_timeout = 60 \\n" - "performance_schema = 0\\n" - "query_cache_type = 1 \" " - "/etc/mysql/my.cnf") - except CommandExecutionError as e: - Log.error(self, "Unable to update MySQL file") - - # Set MySQLTuner permission - EEFileUtils.chmod(self, "/usr/bin/mysqltuner", 0o775) - - EEGit.add(self, ["/etc/mysql"], msg="Adding MySQL into Git") - EEService.reload_service(self, 'mysql') - - if set(EEVariables.ee_mail).issubset(set(apt_packages)): - Log.debug(self, "Adding user") - try: - EEShellExec.cmd_exec(self, "adduser --uid 5000 --home /var" - "/vmail --disabled-password --gecos " - "'' vmail") - except CommandExecutionError as e: - Log.error(self, "Unable to add vmail user for mail server") - try: - EEShellExec.cmd_exec(self, "openssl req -new -x509 -days" - " 3650 " - "-nodes -subj /commonName={hostname}" - "/emailAddress={email} -out /etc/ssl" - "/certs/dovecot." - "pem -keyout " - "/etc/ssl/private/dovecot.pem" - .format(hostname=EEVariables.ee_fqdn, - email=EEVariables.ee_email)) - except CommandExecutionError as e: - Log.error(self, "Unable to generate PEM key for dovecot") - Log.debug(self, "Setting Privileges to " - "/etc/ssl/private/dovecot.pem file ") - EEFileUtils.chmod(self, "/etc/ssl/private/dovecot.pem", 0o600) - - # Custom Dovecot configuration by EasyEngine - data = dict() - Log.debug(self, "Writting configuration into file" - "/etc/dovecot/conf.d/auth-sql.conf.ext ") - ee_dovecot = open('/etc/dovecot/conf.d/auth-sql.conf.ext', - encoding='utf-8', mode='w') - self.app.render((data), 'auth-sql-conf.mustache', - out=ee_dovecot) - ee_dovecot.close() - - 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', - encoding='utf-8', mode='w') - self.app.render((data), 'dovecot.mustache', out=ee_dovecot) - ee_dovecot.close() - try: - 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 - EEShellExec.cmd_exec(self, "sed -i \'s/#submission/" - "submission/\'" - " /etc/postfix/master.cf") - EEShellExec.cmd_exec(self, "sed -i \'s/#smtps/smtps/\'" - " /etc/postfix/master.cf") - - EEShellExec.cmd_exec(self, "postconf -e \"smtpd_sasl_type " - "= dovecot\"") - EEShellExec.cmd_exec(self, "postconf -e \"smtpd_sasl_path " - "= private/auth\"") - EEShellExec.cmd_exec(self, "postconf -e \"" - "smtpd_sasl_auth_enable = " - "yes\"") - EEShellExec.cmd_exec(self, "postconf -e \"" - " smtpd_relay_restrictions =" - " permit_sasl_authenticated, " - " permit_mynetworks, " - " reject_unauth_destination\"") - - EEShellExec.cmd_exec(self, "postconf -e \"" - "smtpd_tls_mandatory_" - "protocols = !SSLv2,!SSLv3\"") - EEShellExec.cmd_exec(self, "postconf -e \"smtp_tls_" - "mandatory_protocols = !SSLv2," - "!SSLv3\"") - EEShellExec.cmd_exec(self, "postconf -e \"smtpd_tls" - "_protocols = !SSLv2,!SSLv3\"") - EEShellExec.cmd_exec(self, "postconf -e \"smtp_tls" - "_protocols = !SSLv2,!SSLv3\"") - EEShellExec.cmd_exec(self, "postconf -e \"mydestination " - "= localhost\"") - EEShellExec.cmd_exec(self, "postconf -e \"virtual" - "_transport " - "= lmtp:unix:private/dovecot-lmtp\"") - EEShellExec.cmd_exec(self, "postconf -e \"virtual_uid_" - "maps = static:5000\"") - EEShellExec.cmd_exec(self, "postconf -e \"virtual_gid_" - "maps = static:5000\"") - EEShellExec.cmd_exec(self, "postconf -e \"" - " virtual_mailbox_domains = " - "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\"") - EEShellExec.cmd_exec(self, "openssl req -new -x509 -days " - " 3650 -nodes -subj /commonName=" - "{hostname}/emailAddress={email}" - " -out /etc/ssl/certs/postfix.pem" - " -keyout /etc/ssl/private/" - "postfix.pem" - .format(hostname=EEVariables.ee_fqdn, - email=EEVariables.ee_email)) - EEShellExec.cmd_exec(self, "chmod 0600 /etc/ssl/private" - "/postfix.pem") - 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\"") - - except CommandExecutionError as e: - Log.Error(self, "Failed to update Dovecot configuration") - - # Sieve configuration - if not os.path.exists('/var/lib/dovecot/sieve/'): - Log.debug(self, 'Creating directory ' - '/var/lib/dovecot/sieve/ ') - os.makedirs('/var/lib/dovecot/sieve/') - - # Custom sieve configuration by EasyEngine - data = dict() - Log.debug(self, "Writting configuration of EasyEngine into " - "file /var/lib/dovecot/sieve/default.sieve") - ee_sieve = open('/var/lib/dovecot/sieve/default.sieve', - encoding='utf-8', mode='w') - self.app.render((data), 'default-sieve.mustache', - out=ee_sieve) - ee_sieve.close() - - # Compile sieve rules - Log.debug(self, "Setting Privileges to dovecot ") - # EEShellExec.cmd_exec(self, "chown -R vmail:vmail /var/lib" - # "/dovecot") - EEFileUtils.chown(self, "/var/lib/dovecot", 'vmail', 'vmail', - recursive=True) - try: - EEShellExec.cmd_exec(self, "sievec /var/lib/dovecot/" - "/sieve/default.sieve") - except CommandExecutionError as e: - raise SiteError("Failed to compile default.sieve") - - EEGit.add(self, ["/etc/postfix", "/etc/dovecot"], - msg="Installed mail server") - EEService.restart_service(self, 'dovecot') - EEService.reload_service(self, 'postfix') - - if set(EEVariables.ee_mailscanner).issubset(set(apt_packages)): - # Set up Custom amavis configuration - data = dict() - Log.debug(self, "Configuring file /etc/amavis/conf.d" - "/15-content_filter_mode") - ee_amavis = open('/etc/amavis/conf.d/15-content_filter_mode', - encoding='utf-8', mode='w') - self.app.render((data), '15-content_filter_mode.mustache', - 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', - encoding='utf-8', mode='w') - self.app.render((data), '50-user.mustache', out=vm_config) - vm_config.close() - - # Amavis postfix configuration - try: - EEShellExec.cmd_exec(self, "postconf -e \"content_filter =" - " smtp-amavis:[127.0.0.1]:10024\"") - EEShellExec.cmd_exec(self, "sed -i \"s/1 pickup/1 " - " pickup" - "\\n -o content_filter=\\n " - " -o receive_override_options=" - "no_header_body" - "_checks/\" /etc/postfix/master.cf") - except CommandExecutionError as e: - raise SiteError("Failed to update Amavis-Postfix config") - - amavis_master = ("""smtp-amavis unix - - n - 2 smtp - -o smtp_data_done_timeout=1200 - -o smtp_send_xforward_command=yes - -o disable_dns_lookups=yes - -o max_use=20 -127.0.0.1:10025 inet n - n - - smtpd - -o content_filter= - -o smtpd_delay_reject=no - -o smtpd_client_restrictions=permit_mynetworks,reject - -o smtpd_helo_restrictions= - -o smtpd_sender_restrictions= - -o smtpd_recipient_restrictions=permit_mynetworks,reject - -o smtpd_data_restrictions=reject_unauth_pipelining - -o smtpd_end_of_data_restrictions= - -o smtpd_restriction_classes= - -o mynetworks=127.0.0.0/8 - -o smtpd_error_sleep_time=0 - -o smtpd_soft_error_limit=1001 - -o smtpd_hard_error_limit=1000 - -o smtpd_client_connection_count_limit=0 - -o smtpd_client_connection_rate_limit=0 - -o local_header_rewrite_clients=""") - - with open("/etc/postfix/master.cf", - encoding='utf-8', mode='a') as am_config: - am_config.write(amavis_master) - - try: - # Amavis ClamAV configuration - Log.debug(self, "Adding new user clamav amavis") - EEShellExec.cmd_exec(self, "adduser clamav amavis") - Log.debug(self, "Adding new user amavis clamav") - EEShellExec.cmd_exec(self, "adduser amavis clamav") - Log.debug(self, "Setting Privileges to /var/lib/amavis" - "/tmp") - EEFileUtils.chmod(self, "/var/lib/amavis/tmp", 0o755) - - # Update ClamAV database - Log.debug(self, "Updating database") - EEShellExec.cmd_exec(self, "freshclam") - except CommandExecutionError as e: - raise SiteError(" Unable to update ClamAV-Amavis config") - - EEGit.add(self, ["/etc/amavis"], msg="Adding Amavis into Git") - EEService.restart_service(self, 'dovecot') - EEService.reload_service(self, 'postfix') - EEService.restart_service(self, 'amavis') - - if len(packages): - if any('/usr/bin/wp' == x[1] for x in packages): - Log.debug(self, "Setting Privileges to /usr/bin/wp file ") - EEFileUtils.chmod(self, "/usr/bin/wp", 0o775) - - if any('/tmp/pma.tar.gz' == x[1] - for x in packages): - EEExtract.extract(self, '/tmp/pma.tar.gz', '/tmp/') - Log.debug(self, 'Extracting file /tmp/pma.tar.gz to ' - 'loaction /tmp/') - if not os.path.exists('{0}22222/htdocs/db' - .format(EEVariables.ee_webroot)): - Log.debug(self, "Creating new directory " - "{0}22222/htdocs/db" - .format(EEVariables.ee_webroot)) - os.makedirs('{0}22222/htdocs/db' - .format(EEVariables.ee_webroot)) - shutil.move('/tmp/phpmyadmin-STABLE/', - '{0}22222/htdocs/db/pma/' - .format(EEVariables.ee_webroot)) - Log.debug(self, 'Setting Privileges of webroot permission to ' - '{0}22222/htdocs/db/pma file ' - .format(EEVariables.ee_webroot)) - EEFileUtils.chown(self, '{0}22222' - .format(EEVariables.ee_webroot), - EEVariables.ee_php_user, - EEVariables.ee_php_user, - recursive=True) - if any('/tmp/memcache.tar.gz' == x[1] - for x in packages): - Log.debug(self, "Extracting memcache.tar.gz to location" - " {0}22222/htdocs/cache/memcache " - .format(EEVariables.ee_webroot)) - EEExtract.extract(self, '/tmp/memcache.tar.gz', - '{0}22222/htdocs/cache/memcache' - .format(EEVariables.ee_webroot)) - Log.debug(self, "Setting Privileges to " - "{0}22222/htdocs/cache/memcache file" - .format(EEVariables.ee_webroot)) - EEFileUtils.chown(self, '{0}22222' - .format(EEVariables.ee_webroot), - EEVariables.ee_php_user, - EEVariables.ee_php_user, - recursive=True) - - if any('/tmp/webgrind.tar.gz' == x[1] - for x in packages): - Log.debug(self, "Extracting file webgrind.tar.gz to " - "location /tmp/ ") - EEExtract.extract(self, '/tmp/webgrind.tar.gz', '/tmp/') - if not os.path.exists('{0}22222/htdocs/php' - .format(EEVariables.ee_webroot)): - Log.debug(self, "Creating directroy " - "{0}22222/htdocs/php" - .format(EEVariables.ee_webroot)) - os.makedirs('{0}22222/htdocs/php' - .format(EEVariables.ee_webroot)) - shutil.move('/tmp/webgrind-master/', - '{0}22222/htdocs/php/webgrind' - .format(EEVariables.ee_webroot)) - - EEFileUtils.searchreplace(self, "{0}22222/htdocs/php/webgrind/" - "config.php" - .format(EEVariables.ee_webroot), - "/usr/local/bin/dot", "/usr/bin/dot") - EEFileUtils.searchreplace(self, "{0}22222/htdocs/php/webgrind/" - "config.php" - .format(EEVariables.ee_webroot), - "Europe/Copenhagen", - EEVariables.ee_timezone) - - EEFileUtils.searchreplace(self, "{0}22222/htdocs/php/webgrind/" - "config.php" - .format(EEVariables.ee_webroot), - "90", "100") - - Log.debug(self, "Setting Privileges of webroot permission to " - "{0}22222/htdocs/php/webgrind/ file " - .format(EEVariables.ee_webroot)) - EEFileUtils.chown(self, '{0}22222' - .format(EEVariables.ee_webroot), - EEVariables.ee_php_user, - EEVariables.ee_php_user, - recursive=True) - - if any('/tmp/anemometer.tar.gz' == x[1] - for x in packages): - Log.debug(self, "Extracting file anemometer.tar.gz to " - "location /tmp/ ") - EEExtract.extract(self, '/tmp/anemometer.tar.gz', '/tmp/') - if not os.path.exists('{0}22222/htdocs/db/' - .format(EEVariables.ee_webroot)): - Log.debug(self, "Creating directory") - os.makedirs('{0}22222/htdocs/db/' - .format(EEVariables.ee_webroot)) - shutil.move('/tmp/Anemometer-master', - '{0}22222/htdocs/db/anemometer' - .format(EEVariables.ee_webroot)) - chars = ''.join(random.sample(string.ascii_letters, 8)) - try: - EEShellExec.cmd_exec(self, 'mysql < {0}22222/htdocs/db' - '/anemometer/install.sql' - .format(EEVariables.ee_webroot)) - except CommandExecutionError as e: - raise SiteError("Unable to import Anemometer database") - - EEMysql.execute(self, 'grant select on *.* to \'anemometer\'' - '@\'{0}\''.format(self.app.config.get('mysql', - 'grant-host'))) - Log.debug(self, "grant all on slow-query-log.*" - " to anemometer@root_user IDENTIFIED BY password ") - EEMysql.execute(self, 'grant all on slow_query_log.* to' - '\'anemometer\'@\'{0}\' IDENTIFIED' - ' BY \'{1}\''.format(self.app.config.get( - 'mysql', 'grant-host'), - chars), - errormsg="cannot grant privillages", log=False) - - # Custom Anemometer configuration - Log.debug(self, "configration Anemometer") - data = dict(host=EEVariables.ee_mysql_host, port='3306', - user='anemometer', password=chars) - ee_anemometer = open('{0}22222/htdocs/db/anemometer' - '/conf/config.inc.php' - .format(EEVariables.ee_webroot), - encoding='utf-8', mode='w') - self.app.render((data), 'anemometer.mustache', - out=ee_anemometer) - ee_anemometer.close() - - if any('/usr/bin/pt-query-advisor' == x[1] - for x in packages): - EEFileUtils.chmod(self, "/usr/bin/pt-query-advisor", 0o775) - - if any('/tmp/vimbadmin.tar.gz' == x[1] for x in packages): - # Extract ViMbAdmin - Log.debug(self, "Extracting ViMbAdmin.tar.gz to " - "location /tmp/") - EEExtract.extract(self, '/tmp/vimbadmin.tar.gz', '/tmp/') - if not os.path.exists('{0}22222/htdocs/' - .format(EEVariables.ee_webroot)): - Log.debug(self, "Creating directory " - "{0}22222/htdocs/" - .format(EEVariables.ee_webroot)) - os.makedirs('{0}22222/htdocs/' - .format(EEVariables.ee_webroot)) - shutil.move('/tmp/ViMbAdmin-{0}/' - .format(EEVariables.ee_vimbadmin), - '{0}22222/htdocs/vimbadmin/' - .format(EEVariables.ee_webroot)) - - # Donwload composer and install ViMbAdmin - Log.debug(self, "Downloading composer " - "https://getcomposer.org/installer | php ") - try: - EEShellExec.cmd_exec(self, "cd {0}22222/htdocs" - "/vimbadmin; curl" - " -sS https://getcomposer.org/" - "installer |" - " php".format(EEVariables.ee_webroot)) - Log.debug(self, "Installating of composer") - EEShellExec.cmd_exec(self, "cd {0}22222/htdocs" - "/vimbadmin && " - "php composer.phar install " - "--prefer-dist" - " --no-dev && rm -f {1}22222/htdocs" - "/vimbadmin/composer.phar" - .format(EEVariables.ee_webroot, - EEVariables.ee_webroot)) - except CommandExecutionError as e: - raise SiteError("Failed to setup ViMbAdmin") - - # Configure vimbadmin database - vm_passwd = ''.join(random.sample(string.ascii_letters, 8)) - Log.debug(self, "Creating vimbadmin database if not exist") - EEMysql.execute(self, "create database if not exists" - " vimbadmin") - Log.debug(self, " grant all privileges on `vimbadmin`.* to" - " `vimbadmin`@`{0}` IDENTIFIED BY" - " ' '".format(self.app.config.get('mysql', - 'grant-host'))) - EEMysql.execute(self, "grant all privileges on `vimbadmin`.* " - " to `vimbadmin`@`{0}` IDENTIFIED BY" - " '{1}'".format(self.app.config.get('mysql', - 'grant-host'), vm_passwd), - errormsg="Cannot grant " - "user privileges", log=False) - vm_salt = (''.join(random.sample(string.ascii_letters + - string.ascii_letters, 64))) - - # Custom Vimbadmin configuration by EasyEngine - data = dict(salt=vm_salt, host=EEVariables.ee_mysql_host, - password=vm_passwd, - php_user=EEVariables.ee_php_user) - Log.debug(self, 'Writting the ViMbAdmin configuration to ' - 'file {0}22222/htdocs/vimbadmin/application/' - 'configs/application.ini' - .format(EEVariables.ee_webroot)) - ee_vmb = open('{0}22222/htdocs/vimbadmin/application/' - 'configs/application.ini' - .format(EEVariables.ee_webroot), - encoding='utf-8', mode='w') - self.app.render((data), 'vimbadmin.mustache', - out=ee_vmb) - ee_vmb.close() - - shutil.copyfile("{0}22222/htdocs/vimbadmin/public/" - ".htaccess.dist" - .format(EEVariables.ee_webroot), - "{0}22222/htdocs/vimbadmin/public/" - ".htaccess".format(EEVariables.ee_webroot)) - Log.debug(self, "Executing command " - "{0}22222/htdocs/vimbadmin/bin" - "/doctrine2-cli.php orm:schema-tool:" - "create".format(EEVariables.ee_webroot)) - try: - EEShellExec.cmd_exec(self, "{0}22222/htdocs/vimbadmin" - "/bin/doctrine2-cli.php " - "orm:schema-tool:create" - .format(EEVariables.ee_webroot)) - except CommandExecutionError as e: - raise SiteError("Unable to create ViMbAdmin schema") - - EEFileUtils.chown(self, '{0}22222' - .format(EEVariables.ee_webroot), - EEVariables.ee_php_user, - EEVariables.ee_php_user, - recursive=True) - - # Copy Dovecot and Postfix templates which are depednet on - # Vimbadmin - - if not os.path.exists('/etc/postfix/mysql/'): - Log.debug(self, "Creating directory " - "/etc/postfix/mysql/") - os.makedirs('/etc/postfix/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', - encoding='utf-8', mode='w') - self.app.render((data), 'virtual_alias_maps.mustache', - out=vm_config) - vm_config.close() - - Log.debug(self, "Writting configuration to " - "/etc/postfix/mysql" - "/virtual_domains_maps.cf file") - vm_config = open('/etc/postfix/mysql/virtual_domains_maps.cf', - encoding='utf-8', mode='w') - self.app.render((data), 'virtual_domains_maps.mustache', - out=vm_config) - vm_config.close() - - Log.debug(self, "Writting configuration to " - "/etc/postfix/mysql" - "/virtual_mailbox_maps.cf file") - vm_config = open('/etc/postfix/mysql/virtual_mailbox_maps.cf', - encoding='utf-8', mode='w') - self.app.render((data), 'virtual_mailbox_maps.mustache', - out=vm_config) - vm_config.close() - - Log.debug(self, "Writting configration" - " to /etc/dovecot/dovecot-sql.conf.ext file ") - vm_config = open('/etc/dovecot/dovecot-sql.conf.ext', - encoding='utf-8', mode='w') - self.app.render((data), 'dovecot-sql-conf.mustache', - out=vm_config) - vm_config.close() - - # If Amavis is going to be installed then configure Vimabadmin - # Amvis settings - if set(EEVariables.ee_mailscanner).issubset(set(apt_packages)): - vm_config = open('/etc/amavis/conf.d/50-user', - encoding='utf-8', mode='w') - self.app.render((data), '50-user.mustache', - out=vm_config) - vm_config.close() - EEService.restart_service(self, 'dovecot') - EEService.reload_service(self, 'nginx') - EEService.reload_service(self, 'php5-fpm') - self.msg = (self.msg + ["Configure ViMbAdmin:\thttps://{0}:" - "22222/vimbadmin".format(EEVariables.ee_fqdn)] - + ["Security Salt: {0}".format(vm_salt)]) - - if any('/tmp/roundcube.tar.gz' == x[1] for x in packages): - # Extract RoundCubemail - Log.debug(self, "Extracting file /tmp/roundcube.tar.gz " - "to location /tmp/ ") - EEExtract.extract(self, '/tmp/roundcube.tar.gz', '/tmp/') - if not os.path.exists('{0}roundcubemail' - .format(EEVariables.ee_webroot)): - Log.debug(self, "Creating new directory " - " {0}roundcubemail/" - .format(EEVariables.ee_webroot)) - os.makedirs('{0}roundcubemail/' - .format(EEVariables.ee_webroot)) - shutil.move('/tmp/roundcubemail-{0}/' - .format(EEVariables.ee_roundcube), - '{0}roundcubemail/htdocs' - .format(EEVariables.ee_webroot)) - - # Install Roundcube depednet pear packages - EEShellExec.cmd_exec(self, "pear install Mail_Mime Net_SMTP" - " Mail_mimeDecode Net_IDNA2-beta " - "Auth_SASL Net_Sieve Crypt_GPG") - - # Configure roundcube database - rc_passwd = ''.join(random.sample(string.ascii_letters, 8)) - Log.debug(self, "Creating Database roundcubemail") - EEMysql.execute(self, "create database if not exists " - " roundcubemail") - Log.debug(self, "grant all privileges" - " on `roundcubemail`.* to " - " `roundcube`@`{0}` IDENTIFIED BY " - "' '".format(self.app.config.get( - 'mysql', 'grant-host'))) - EEMysql.execute(self, "grant all privileges" - " on `roundcubemail`.* to " - " `roundcube`@`{0}` IDENTIFIED BY " - "'{1}'".format(self.app.config.get( - 'mysql', 'grant-host'), - rc_passwd)) - EEShellExec.cmd_exec(self, "mysql roundcubemail < {0}" - "roundcubemail/htdocs/SQL/mysql" - ".initial.sql" - .format(EEVariables.ee_webroot)) - - shutil.copyfile("{0}roundcubemail/htdocs/config/" - "config.inc.php.sample" - .format(EEVariables.ee_webroot), - "{0}roundcubemail/htdocs/config/" - "config.inc.php" - .format(EEVariables.ee_webroot)) - EEShellExec.cmd_exec(self, "sed -i \"s\'mysql://roundcube:" - "pass@localhost/roundcubemail\'mysql://" - "roundcube:{0}@{1}/" - "roundcubemail\'\" {2}roundcubemail" - "/htdocs/config/config." - "inc.php" - .format(rc_passwd, - EEVariables.ee_mysql_host, - EEVariables.ee_webroot)) - - # Sieve plugin configuration in roundcube - EEShellExec.cmd_exec(self, "bash -c \"sed -i \\\"s:\$config\[" - "\'plugins\'\] " - "= array(:\$config\['plugins'\] = " - "array(\\n \'sieverules\',:\\\" " - "{0}roundcubemail/htdocs/config" - .format(EEVariables.ee_webroot) - + "/config.inc.php\"") - EEShellExec.cmd_exec(self, "echo \"\$config['sieverules_port']" - "=4190;\" >> {0}roundcubemail" - .format(EEVariables.ee_webroot) - + "/htdocs/config/config.inc.php") - - data = dict(site_name='webmail', www_domain='webmail', - static=False, - basic=True, wp=False, w3tc=False, wpfc=False, - wpsc=False, multisite=False, wpsubdir=False, - webroot=EEVariables.ee_webroot, ee_db_name='', - ee_db_user='', ee_db_pass='', ee_db_host='', - rc=True) - - Log.debug(self, 'Writting the nginx configuration for ' - 'RoundCubemail') - ee_rc = open('/etc/nginx/sites-available/webmail', - encoding='utf-8', mode='w') - self.app.render((data), 'virtualconf.mustache', - out=ee_rc) - ee_rc.close() - - # Create Symbolic link for webmail - EEFileUtils.create_symlink(self, ['/etc/nginx/sites-available' - '/webmail', - '/etc/nginx/sites-enabled/' - 'webmail']) - # Create log folder and softlinks - if not os.path.exists('{0}roundcubemail/logs' - .format(EEVariables.ee_webroot)): - os.makedirs('{0}roundcubemail/logs' - .format(EEVariables.ee_webroot)) - - EEFileUtils.create_symlink(self, ['/var/log/nginx/' - 'webmail.access.log', - '{0}roundcubemail/' - 'logs/access.log' - .format(EEVariables.ee_webroot)]) - - EEFileUtils.create_symlink(self, ['/var/log/nginx/' - 'webmail.error.log', - '{0}roundcubemail/' - 'logs/error.log' - .format(EEVariables.ee_webroot)]) - # Remove roundcube installer - EEService.reload_service(self, 'nginx') - EEFileUtils.remove(self, ["{0}roundcubemail/htdocs/installer" - .format(EEVariables.ee_webroot)]) - EEFileUtils.chown(self, '{0}roundcubemail' - .format(EEVariables.ee_webroot), - EEVariables.ee_php_user, - EEVariables.ee_php_user, - recursive=True) - + @expose(help="Install packages") def install(self, packages=[], apt_packages=[], disp_msg=True): """Start installation of packages""" diff --git a/ee/core/download.py b/ee/core/download.py index c0796658..0e28c765 100644 --- a/ee/core/download.py +++ b/ee/core/download.py @@ -26,6 +26,7 @@ class EEDownload(): Log.info(self, "{0}".format("[" + Log.ENDC + "Done" + Log.OKBLUE + "]")) except urllib.error.URLError as e: + print("I am here") Log.debug(self, "[{err}]".format(err=str(e.reason))) Log.error(self, "Unable to donwload file, {0}" .format(filename))