Browse Source

Merge branch 'python'

bugfixes
gau1991 10 years ago
parent
commit
4508aec025
  1. 3
      ee/cli/main.py
  2. 19
      ee/cli/plugins/debug.py
  3. 15
      ee/cli/plugins/secure.py
  4. 29
      ee/cli/plugins/site.py
  5. 30
      ee/cli/plugins/site_functions.py
  6. 128
      ee/cli/plugins/stack.py
  7. 3
      ee/core/addswap.py
  8. 9
      ee/core/apt_repo.py
  9. 25
      ee/core/aptget.py
  10. 4
      ee/core/checkfqdn.py
  11. 2
      ee/core/fileutils.py
  12. 6
      ee/core/logging.py
  13. 4
      ee/core/logwatch.py
  14. 7
      ee/core/mysql.py
  15. 10
      ee/core/shellexec.py
  16. 2
      ee/core/variables.py
  17. 130
      install

3
ee/cli/main.py

@ -94,6 +94,9 @@ def main():
# Default Cement signals are SIGINT and SIGTERM, exit 0 (non-error)
code = 0
print(e)
except Exception as e:
code = 1
print(e)
finally:
# Print an exception (if it occurred) and --debug was passed
if app.debug:

19
ee/cli/plugins/debug.py

@ -63,7 +63,7 @@ class EEDebugController(CementBaseController):
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()):
'nginx.conf', encoding='utf-8').read()):
Log.info(self, "Setting up Nginx debug connection"
" for "+ip_addr)
EEShellExec.cmd_exec(self, "sed -i \"/events {{/a\\ \\ \\ "
@ -79,7 +79,8 @@ class EEDebugController(CementBaseController):
# stop global debug
elif not self.start and not self.app.pargs.site_name:
if "debug_connection " in open('/etc/nginx/nginx.conf').read():
if "debug_connection " in open('/etc/nginx/nginx.conf',
encoding='utf-8').read():
Log.info(self, "Disabling Nginx debug connections")
EEShellExec.cmd_exec(self, "sed -i \"/debug_connection.*/d\""
" /etc/nginx/nginx.conf")
@ -146,7 +147,8 @@ class EEDebugController(CementBaseController):
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')
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()
self.trigger_php = True
@ -165,7 +167,8 @@ class EEDebugController(CementBaseController):
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')
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()
self.trigger_php = True
@ -186,7 +189,8 @@ class EEDebugController(CementBaseController):
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:
with open('/etc/php5/fpm/php-fpm.conf',
encoding='utf-8', mode='w') as configfile:
Log.debug(self, "Writting php5-FPM configuration into "
"/etc/php5/fpm/php-fpm.conf")
config.write(configfile)
@ -206,7 +210,8 @@ class EEDebugController(CementBaseController):
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:
with 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)
@ -278,7 +283,7 @@ class EEDebugController(CementBaseController):
" grep true".format(wp_config)):
Log.info(self, "Starting WordPress debug")
open("{0}/htdocs/wp-content/debug.log".format(webroot),
'a').close()
encoding='utf-8', mode='a').close()
EEShellExec.cmd_exec(self, "chown {1}: {0}/htdocs/wp-"
"content/debug.log"
"".format(webroot,

15
ee/cli/plugins/secure.py

@ -60,18 +60,23 @@ class EESecureController(CementBaseController):
self.app.pargs.user_pass = password
if password == "":
self.app.pargs.user_pass = passwd
Log.debug(self, "printf username:"
"$(openssl passwd -crypt "
"password 2> /dev/null)\n\""
"> /etc/nginx/htpasswd-ee 2>/dev/null")
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))
password=self.app.pargs.user_pass),
log=False)
Log.info(self, "Successfully changed HTTP authentication"
" username to : {username}"
.format(username=self.app.pargs.user_input))
.format(username=self.app.pargs.user_input), log=False)
Log.info(self, "Successfully changed HTTP authentication"
" password to : {password}"
.format(password=self.app.pargs.user_pass))
.format(password=self.app.pargs.user_pass), log=False)
@expose(hide=True)
def secure_port(self):
@ -92,12 +97,12 @@ class EESecureController(CementBaseController):
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"
"/etc/nginx/sites-available/22222"
.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"
"/etc/nginx/sites-available/22222"
.format(port=self.app.pargs.user_input))
Log.info(self, "Successfully port changed {port}"
.format(port=self.app.pargs.user_input))

29
ee/cli/plugins/site.py

@ -47,12 +47,14 @@ class EESiteController(CementBaseController):
.format(ee_domain),
'/etc/nginx/sites-enabled/{0}'
.format(ee_domain)])
EEGit.add(self, ["/etc/nginx"],
msg="Enabled {0} "
.format(ee_domain))
updateSiteInfo(self, ee_domain, enabled=True)
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
EEService.reload_service(self, 'nginx')
else:
Log.error(self, " site {0} does not exists".format(ee_domain))
Log.error(self, "\nsite {0} does not exists".format(ee_domain))
@expose(help="Disable site example.com")
def disable(self):
@ -62,12 +64,15 @@ class EESiteController(CementBaseController):
.format(ee_domain)):
if not os.path.isfile('/etc/nginx/sites-enabled/{0}'
.format(ee_domain)):
Log.debug(self, "Site {0} already disabled" + ee_domain)
Log.debug(self, "Site {0} already disabled".format(ee_domain))
Log.info(self, "[" + Log.FAIL + "Failed" + Log.OKBLUE+"]")
else:
EEFileUtils.remove_symlink(self,
'/etc/nginx/sites-enabled/{0}'
.format(ee_domain))
EEGit.add(self, ["/etc/nginx"],
msg="Disabled {0} "
.format(ee_domain))
updateSiteInfo(self, ee_domain, enabled=False)
Log.info(self, "[" + Log.ENDC + "OK" + Log.OKBLUE + "]")
EEService.reload_service(self, 'nginx')
@ -152,7 +157,8 @@ class EESiteController(CementBaseController):
.format(ee_domain)):
Log.info(self, "Display NGINX configuration for {0}"
.format(ee_domain))
f = open('/etc/nginx/sites-available/{0}'.format(ee_domain), "r")
f = open('/etc/nginx/sites-available/{0}'.format(ee_domain),
encoding='utf-8', mode='r')
text = f.read()
Log.info(self, Log.ENDC + text)
f.close()
@ -436,7 +442,7 @@ class EESiteCreateController(CementBaseController):
data = setupdatabase(self, data)
try:
eedbconfig = open("{0}/ee-config.php".format(ee_site_webroot),
'w')
encoding='utf-8', mode='w')
eedbconfig.write("<?php \ndefine('DB_NAME', '{0}');"
"\ndefine('DB_USER', '{1}'); "
"\ndefine('DB_PASSWORD', '{2}');"
@ -469,9 +475,9 @@ class EESiteCreateController(CementBaseController):
if data['wp']:
Log.info(self, Log.ENDC + "WordPress admin user :"
" {0}".format(ee_wp_creds['wp_user']))
" {0}".format(ee_wp_creds['wp_user']), log=False)
Log.info(self, Log.ENDC + "WordPress admin user password : {0}"
.format(ee_wp_creds['wp_pass']))
.format(ee_wp_creds['wp_pass']), log=False)
display_cache_settings(self, data)
addNewSite(self, ee_www_domain, stype, cache, ee_site_webroot)
@ -851,7 +857,7 @@ class EESiteUpdateController(CementBaseController):
data = setupdatabase(self, data)
try:
eedbconfig = open("{0}/ee-config.php".format(ee_site_webroot),
'w')
encoding='utf-8', mode='w')
eedbconfig.write("<?php \ndefine('DB_NAME', '{0}');"
"\ndefine('DB_USER', '{1}'); "
"\ndefine('DB_PASSWORD', '{2}');"
@ -934,7 +940,7 @@ class EESiteDeleteController(CementBaseController):
label = 'delete'
stacked_on = 'site'
stacked_type = 'nested'
description = 'To delete website'
description = 'delete an existing website'
arguments = [
(['site_name'],
dict(help='domain name to be deleted')),
@ -950,6 +956,7 @@ class EESiteDeleteController(CementBaseController):
]
@expose(help="Delete website configuration and files")
@expose(hide=True)
def default(self):
# TODO Write code for ee site update here
(ee_domain, ee_www_domain) = ValidateDomain(self.app.pargs.site_name)
@ -1011,7 +1018,11 @@ class EESiteDeleteController(CementBaseController):
Log.debug(self, "Removing Nginx configuration")
EEFileUtils.rm(self, '/etc/nginx/sites-available/{0}'
.format(ee_domain))
EEGit.add(self, ["/etc/nginx"],
msg="Deleted {0} "
.format(ee_domain))
deleteSiteInfo(self, ee_domain)
Log.info(self, "Deleted site {0}".format(ee_domain))
else:
Log.error(self, " site {0} does not exists".format(ee_domain))

30
ee/cli/plugins/site_functions.py

@ -22,7 +22,8 @@ def setupdomain(self, data):
# write nginx config for file
try:
ee_site_nginx_conf = open('/etc/nginx/sites-available/{0}'
.format(ee_domain_name), 'w')
.format(ee_domain_name), encoding='utf-8',
mode='w')
self.app.render((data), 'virtualconf.mustache',
out=ee_site_nginx_conf)
@ -112,20 +113,24 @@ def setupdatabase(self, data):
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))
.format(ee_db_name), errormsg="Cannot create database")
# Create MySQL User
Log.debug(self, "Creating user {0}".format(ee_db_username))
Log.debug(self, "create user {0}@{1} identified by ''"
.format(ee_db_username, ee_mysql_grant_host))
EEMysql.execute(self,
"create user {0}@{1} identified by '{2}'"
.format(ee_db_username, ee_mysql_grant_host,
ee_db_password))
ee_db_password),
errormsg="Cannot setup database user", log=False)
# 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))
.format(ee_db_name, ee_db_username, ee_mysql_grant_host),
errormsg="Cannot setup database user privileges")
Log.info(self, "[" + Log.ENDC + "Done" + Log.OKBLUE + "]")
data['ee_db_name'] = ee_db_name
@ -442,7 +447,12 @@ def updatewpuserpassword(self, ee_domain, ee_site_webroot):
Log.error(self, "{0} does not seem to be a WordPress site"
.format(ee_domain))
ee_wp_user = input("Provide WordPress user name [admin]: ")
try:
ee_wp_user = input("Provide WordPress user name [admin]: ")
except Exception as e:
Log.debug(self, "{0}".format(e))
Log.error(self, "\nCould not update password")
if ee_wp_user == "?":
Log.info(self, "Fetching WordPress user list")
EEShellExec.cmd_exec(self, "wp --allow-root user list "
@ -457,8 +467,14 @@ def updatewpuserpassword(self, ee_domain, ee_site_webroot):
.format(ee_wp_user))
if is_user_exist:
ee_wp_pass = input("Provide password for {0} user: "
.format(ee_wp_user))
try:
ee_wp_pass = getpass.getpass(prompt="Provide password for "
"{0} user: "
.format(ee_wp_user))
except Exception as e:
Log.debug(self, "{0}".format(e))
Log.error(self, "Could not update password")
if len(ee_wp_pass) > 8:
EEShellExec.cmd_exec(self, "wp --allow-root user update {0}"
" --user_pass={1}"

128
ee/cli/plugins/stack.py

@ -109,7 +109,8 @@ class EEStackController(CementBaseController):
config = configparser.ConfigParser()
config.read_string(mysql_config)
Log.debug(self, 'Writting configuration into MySQL file')
with open(os.path.expanduser("~")+'/.my.cnf', 'w') as configfile:
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)):
@ -174,7 +175,8 @@ class EEStackController(CementBaseController):
data = dict(version=EEVariables.ee_version)
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', 'w')
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()
@ -182,20 +184,23 @@ class EEStackController(CementBaseController):
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', 'w')
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', 'w')
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")
Log.debug(self, 'Writting the nginx configuration to '
'file /etc/nginx/conf.d/upstream.conf ')
ee_nginx = open('/etc/nginx/conf.d/upstream.conf', 'w')
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()
@ -208,56 +213,64 @@ class EEStackController(CementBaseController):
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', 'w')
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', 'w')
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.conf')
ee_nginx = open('/etc/nginx/common/php.conf', 'w')
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', 'w')
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', 'w')
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', 'w')
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', 'w')
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', 'w')
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()
@ -265,9 +278,9 @@ class EEStackController(CementBaseController):
# 22222 port settings
Log.debug(self, 'Writting the nginx configuration to '
'file /etc/nginx/sites-available/'
'22222.conf')
ee_nginx = open('/etc/nginx/sites-available/22222.conf',
'w')
'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()
@ -284,10 +297,10 @@ class EEStackController(CementBaseController):
# Create Symbolic link for 22222
EEFileUtils.create_symlink(self, ['/etc/nginx/'
'sites-available/'
'22222.conf',
'22222',
'/etc/nginx/'
'sites-enabled/'
'22222.conf'])
'22222'])
# Create log and cert folder and softlinks
if not os.path.exists('{0}22222/logs'
.format(EEVariables.ee_webroot)):
@ -369,7 +382,8 @@ class EEStackController(CementBaseController):
config['PHP']['upload_max_filesize'] = '100M'
config['PHP']['max_execution_time'] = '300'
config['PHP']['date.timezone'] = time.tzname[time.daylight]
with open('/etc/php5/fpm/php.ini', 'w') as configfile:
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)
@ -381,7 +395,8 @@ class EEStackController(CementBaseController):
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:
with 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)
@ -399,7 +414,8 @@ class EEStackController(CementBaseController):
config['www']['request_terminate_timeout'] = '300'
config['www']['pm'] = 'ondemand'
config['www']['listen'] = '127.0.0.1:9000'
with open('/etc/php5/fpm/pool.d/www.conf', 'w') as configfile:
with 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)
@ -412,12 +428,14 @@ class EEStackController(CementBaseController):
config = configparser.ConfigParser()
config.read('/etc/php5/fpm/pool.d/debug.conf')
config['debug']['listen'] = '127.0.0.1:9001'
with open('/etc/php5/fpm/pool.d/debug.conf', 'w') as confifile:
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", "a") as myfile:
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 "
@ -434,9 +452,11 @@ class EEStackController(CementBaseController):
os.makedirs('{0}22222/htdocs/fpm/status/'
.format(EEVariables.ee_webroot))
open('{0}22222/htdocs/fpm/status/debug'
.format(EEVariables.ee_webroot), 'a').close()
.format(EEVariables.ee_webroot),
encoding='utf-8', mode='a').close()
open('{0}22222/htdocs/fpm/status/php'
.format(EEVariables.ee_webroot), 'a').close()
.format(EEVariables.ee_webroot),
encoding='utf-8', mode='a').close()
# Write info.php
if not os.path.exists('{0}22222/htdocs/php/'
@ -448,7 +468,8 @@ class EEStackController(CementBaseController):
.format(EEVariables.ee_webroot))
with open("{0}22222/htdocs/php/info.php"
.format(EEVariables.ee_webroot), "w") as myfile:
.format(EEVariables.ee_webroot),
encoding='utf-8', mode='w') as myfile:
myfile.write("<?php\nphpinfo();\n?>")
EEFileUtils.chown(self, "{0}22222"
@ -471,7 +492,8 @@ class EEStackController(CementBaseController):
if not os.path.isfile("/etc/mysql/my.cnf"):
config = ("[mysqld]\nwait_timeout = 30\n"
"interactive_timeout=60\nperformance_schema = 0")
config_file = open("/etc/mysql/my.cnf", "w")
config_file = open("/etc/mysql/my.cnf",
encoding='utf-8', mode='w')
config_file.write(config)
config_file.close()
else:
@ -481,7 +503,7 @@ class EEStackController(CementBaseController):
"performance_schema = 0\" "
"/etc/mysql/my.cnf")
EEGit.add(self, ["/etc/mysql"], msg="Adding Nginx into Git")
EEGit.add(self, ["/etc/mysql"], msg="Adding MySQL into Git")
EEService.reload_service(self, 'mysql')
if set(EEVariables.ee_mail).issubset(set(apt_packages)):
@ -505,7 +527,8 @@ class EEStackController(CementBaseController):
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')
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()
@ -595,7 +618,8 @@ class EEStackController(CementBaseController):
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', 'w')
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()
@ -619,7 +643,7 @@ class EEStackController(CementBaseController):
Log.debug(self, "Configuring file /etc/amavis/conf.d"
"/15-content_filter_mode")
ee_amavis = open('/etc/amavis/conf.d/15-content_filter_mode',
'w')
encoding='utf-8', mode='w')
self.app.render((data), '15-content_filter_mode.mustache',
out=ee_amavis)
ee_amavis.close()
@ -634,7 +658,8 @@ class EEStackController(CementBaseController):
"$3 }\' | tr -d '\\n'").read()
data = dict(host=vm_host, password=vm_pass)
vm_config = open('/etc/amavis/conf.d/50-user', 'w')
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()
@ -670,7 +695,8 @@ class EEStackController(CementBaseController):
-o smtpd_client_connection_rate_limit=0
-o local_header_rewrite_clients=""")
with open("/etc/postfix/master.cf", "a") as am_config:
with open("/etc/postfix/master.cf",
encoding='utf-8', mode='a') as am_config:
am_config.write(amavis_master)
# Amavis ClamAV configuration
@ -795,7 +821,8 @@ class EEStackController(CementBaseController):
user='anemometer', password=chars)
ee_anemometer = open('{0}22222/htdocs/db/anemometer'
'/conf/config.inc.php'
.format(EEVariables.ee_webroot), 'w')
.format(EEVariables.ee_webroot),
encoding='utf-8', mode='w')
self.app.render((data), 'anemometer.mustache',
out=ee_anemometer)
ee_anemometer.close()
@ -861,7 +888,8 @@ class EEStackController(CementBaseController):
.format(EEVariables.ee_webroot))
ee_vmb = open('{0}22222/htdocs/vimbadmin/application/'
'configs/application.ini'
.format(EEVariables.ee_webroot), 'w')
.format(EEVariables.ee_webroot),
encoding='utf-8', mode='w')
self.app.render((data), 'vimbadmin.mustache',
out=ee_vmb)
ee_vmb.close()
@ -900,7 +928,7 @@ class EEStackController(CementBaseController):
host=EEVariables.ee_mysql_host)
vm_config = open('/etc/postfix/mysql/virtual_alias_maps.cf',
'w')
encoding='utf-8', mode='w')
self.app.render((data), 'virtual_alias_maps.mustache',
out=vm_config)
vm_config.close()
@ -909,7 +937,7 @@ class EEStackController(CementBaseController):
"/etc/postfix/mysql"
"/virtual_domains_maps.cf file")
vm_config = open('/etc/postfix/mysql/virtual_domains_maps.cf',
'w')
encoding='utf-8', mode='w')
self.app.render((data), 'virtual_domains_maps.mustache',
out=vm_config)
vm_config.close()
@ -918,7 +946,7 @@ class EEStackController(CementBaseController):
"/etc/postfix/mysql"
"/virtual_mailbox_maps.cf file")
vm_config = open('/etc/postfix/mysql/virtual_mailbox_maps.cf',
'w')
encoding='utf-8', mode='w')
self.app.render((data), 'virtual_mailbox_maps.mustache',
out=vm_config)
vm_config.close()
@ -926,7 +954,7 @@ class EEStackController(CementBaseController):
Log.debug(self, "Writting configration"
" to /etc/dovecot/dovecot-sql.conf.ext file ")
vm_config = open('/etc/dovecot/dovecot-sql.conf.ext',
'w')
encoding='utf-8', mode='w')
self.app.render((data), 'dovecot-sql-conf.mustache',
out=vm_config)
vm_config.close()
@ -935,7 +963,7 @@ class EEStackController(CementBaseController):
# Amvis settings
if set(EEVariables.ee_mailscanner).issubset(set(apt_packages)):
vm_config = open('/etc/amavis/conf.d/50-user',
'w')
encoding='utf-8', mode='w')
self.app.render((data), '50-user.mustache',
out=vm_config)
vm_config.close()
@ -1024,16 +1052,17 @@ class EEStackController(CementBaseController):
Log.debug(self, 'Writting the nginx configuration for '
'RoundCubemail')
ee_rc = open('/etc/nginx/sites-available/webmail.conf', 'w')
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.conf
# Create Symbolic link for webmail
EEFileUtils.create_symlink(self, ['/etc/nginx/sites-available'
'/webmail.conf',
'/webmail',
'/etc/nginx/sites-enabled/'
'webmail.conf'])
'webmail'])
# Create log folder and softlinks
if not os.path.exists('{0}roundcubemail/logs'
.format(EEVariables.ee_webroot)):
@ -1053,8 +1082,7 @@ class EEStackController(CementBaseController):
.format(EEVariables.ee_webroot)])
# Remove roundcube installer
EEService.reload_service(self, 'nginx')
EEFileUtils.remove(self, ["{0}roundcubemail"
"/htdocs/installer"
EEFileUtils.remove(self, ["{0}roundcubemail/htdocs/installer"
.format(EEVariables.ee_webroot)])
EEFileUtils.chown(self, '{0}roundcubemail'
.format(EEVariables.ee_webroot),
@ -1337,7 +1365,7 @@ class EEStackController(CementBaseController):
.format(EEVariables.ee_webroot)]
if self.app.pargs.adminer:
Log.debug(self, "Removing package variable of Adminer ")
packages = packages + ['{0}22222/htdocs/db/Adminer'
packages = packages + ['{0}22222/htdocs/db/adminer'
.format(EEVariables.ee_webroot)]
if self.app.pargs.utils:
Log.debug(self, "Removing package variable of utils ")
@ -1345,12 +1373,12 @@ class EEStackController(CementBaseController):
.format(EEVariables.ee_webroot),
'{0}22222/htdocs/cache/opcache'
.format(EEVariables.ee_webroot),
'{0}22222/htdocs/cache/Nginx/'
'{0}22222/htdocs/cache/nginx/'
'clean.php'.format(EEVariables.ee_webroot),
'{0}22222/htdocs/cache/Memcache'
'{0}22222/htdocs/cache/memcache'
.format(EEVariables.ee_webroot),
'/usr/bin/pt-query-advisor',
'{0}22222/htdocs/db/Anemometer'
'{0}22222/htdocs/db/anemometer'
.format(EEVariables.ee_webroot)]
if len(apt_packages):

3
ee/core/addswap.py

@ -23,5 +23,6 @@ class EESwap():
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:
with open("/etc/fstab",
encoding='utf-8', mode='a') as swap_file:
swap_file.write("/ee-swapfile\tnone\tswap\tsw\t0 0")

9
ee/core/apt_repo.py

@ -26,12 +26,15 @@ class EERepo():
+ EEVariables().ee_repo_file)
try:
if not os.path.isfile(repo_file_path):
with open(repo_file_path, "a") as repofile:
with open(repo_file_path,
encoding='utf-8', mode='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:
elif repo_url not in open(repo_file_path,
encoding='utf-8').read():
with open(repo_file_path,
encoding='utf-8', mode='a') as repofile:
repofile.write(repo_url)
repofile.write('\n')
repofile.close()

25
ee/core/aptget.py

@ -4,6 +4,7 @@ import apt_pkg
import sys
from ee.core.logging import Log
from sh import apt_get
from sh import ErrorReturnCode
class EEAptGet():
@ -17,7 +18,8 @@ class EEAptGet():
apt_cache = apt.cache.Cache()
import sys
orig_out = sys.stdout
sys.stdout = open(self.app.config.get('log.logging', 'file'), 'a')
sys.stdout = open(self.app.config.get('log.logging', 'file'),
encoding='utf-8', mode='a')
apt_cache.update(apt.progress.text.AcquireProgress())
sys.stdout = orig_out
# success = (apt_cache.commit(
@ -43,7 +45,7 @@ class EEAptGet():
success = (apt_cache.commit(
apt.progress.text.AcquireProgress(),
apt.progress.base.InstallProgress()))
#apt_cache.close()
# apt_cache.close()
return success
except AttributeError as e:
Log.error(self, 'AttributeError: ' + str(e))
@ -64,11 +66,11 @@ class EEAptGet():
pkg = apt_cache[package_name.strip()]
if package_name.strip() in apt_cache:
if pkg.is_installed:
#apt_pkg.PkgSystemUnLock()
# apt_pkg.PkgSystemUnLock()
Log.debug(self, 'Trying to install a package that '
'is already installed (' +
package_name.strip() + ')')
#apt_cache.close()
# apt_cache.close()
return False
else:
try:
@ -78,7 +80,7 @@ class EEAptGet():
Log.debug(self, str(e))
Log.error(self, str(e))
else:
#apt_cache.close()
# apt_cache.close()
Log.error(self, 'Unknown package selected (' +
package_name.strip() + ')')
@ -88,19 +90,19 @@ class EEAptGet():
if apt_cache.install_count > 0:
try:
#apt_pkg.PkgSystemUnLock()
# apt_pkg.PkgSystemUnLock()
orig_out = sys.stdout
sys.stdout = open(self.app.config.get('log.logging', 'file'),
'a')
encoding='utf-8', mode='a')
result = apt_cache.commit(apt.progress.text.AcquireProgress(),
apt.progress.base.InstallProgress())
sys.stdout = orig_out
#apt_cache.close()
# apt_cache.close()
return result
except SystemError as e:
Log.debug(self, 'SystemError: ' + str(e))
Log.error(self, 'SystemError: ' + str(e))
#apt_cache.close()
# apt_cache.close()
except Exception as e:
Log.debug(self, str(e))
Log.error(self, str(e))
@ -145,7 +147,7 @@ class EEAptGet():
# apt_pkg.PkgSystemUnLock()
orig_out = sys.stdout
sys.stdout = open(self.app.config.get('log.logging', 'file'),
'a')
encoding='utf-8', mode='a')
result = apt_cache.commit(apt.progress.text.AcquireProgress(),
apt.progress.base.InstallProgress())
sys.stdout = orig_out
@ -165,7 +167,8 @@ class EEAptGet():
"""
try:
orig_out = sys.stdout
sys.stdout = open(self.app.config.get('log.logging', 'file'), 'a')
sys.stdout = open(self.app.config.get('log.logging', 'file'),
encoding='utf-8', mode='a')
apt_get.autoclean("-y")
sys.stdout = orig_out
except ErrorReturnCode as e:

4
ee/core/checkfqdn.py

@ -5,10 +5,10 @@ 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()
# 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:
with open('/etc/hostname', encoding='utf-8', mode='w') as hostfile:
hostfile.write(ee_host)
EEShellExec.cmd_exec(self, "sed -i \"1i\\127.0.0.1 {0}\" /etc/hosts"

2
ee/core/fileutils.py

@ -196,7 +196,7 @@ class EEFileUtils():
Searches for string in file and returns the matched line.
"""
try:
for line in open(fnm):
for line in open(fnm, encoding='utf-8'):
if sstr in line:
return line
except OSError as e:

6
ee/core/logging.py

@ -23,12 +23,14 @@ class Log:
self.app.log.error(Log.FAIL + msg + Log.ENDC)
self.app.close(1)
def info(self, msg, end='\n'):
def info(self, msg, end='\n', log=True):
"""
Logs info messages into log file
"""
print(Log.OKBLUE + msg + Log.ENDC, end=end)
self.app.log.info(Log.OKBLUE + msg + Log.ENDC)
if log:
self.app.log.info(Log.OKBLUE + msg + Log.ENDC)
def warn(self, msg):
"""

4
ee/core/logwatch.py

@ -96,7 +96,7 @@ class LogWatcher(object):
def tail(fname, window):
"""Read last N lines from file fname."""
try:
f = open(fname, 'r')
f = open(fname, encoding='utf-8', mode='r')
except IOError as err:
if err.errno == errno.ENOENT:
return []
@ -166,7 +166,7 @@ class LogWatcher(object):
def watch(self, fname):
try:
file = open(fname, "r")
file = open(fname, encoding='utf-8', mode='r')
fid = self.get_file_id(os.stat(fname))
except EnvironmentError as err:
if err.errno != errno.ENOENT:

7
ee/core/mysql.py

@ -9,7 +9,7 @@ from ee.core.logging import Log
class EEMysql():
"""Method for MySQL connection"""
def execute(self, statement, errormsg=''):
def execute(self, statement, errormsg='', log=True):
"""Get login details from ~/.my.cnf & Execute MySQL query"""
config = configparser.RawConfigParser()
cnfpath = expanduser("~")+"/.my.cnf"
@ -43,7 +43,10 @@ class EEMysql():
.format(e))
try:
Log.debug(self, "Executing MySQL statement: {0}".format(statement))
if log:
Log.debug(self, "Executing MySQL statement: {0}"
.format(statement))
cur.execute(statement)
except Exception as e:
cur.close()

10
ee/core/shellexec.py

@ -26,16 +26,18 @@ class EEShellExec():
if errormsg:
Log.error(self, errormsg)
else:
Log.debug(self, "{0}".format(e))
Log.error(self, "Unable to execute command {0}"
Log.debug(self, "Unable to execute command {0}"
.format(command))
Log.debug(self, "{0}".format(e))
Log.error(self, "Error occured while executing 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}"
Log.debug(self, "Unable to execute command {0}"
.format(command))
Log.debug(self, "{0}".format(e))
Log.error(self, "Error occurred while executing command")
def invoke_editor(self, filepath, errormsg=''):
"""

2
ee/core/variables.py

@ -12,7 +12,7 @@ class EEVariables():
"""Intialization of core variables"""
# EasyEngine version
ee_version = "3.0.0"
ee_version = "3.0.1"
# EasyEngine packages versions
ee_wp_cli = "0.18.0"

130
install

@ -5,6 +5,7 @@
# to update current EasyEngine from 2.x to 3.x
old_ee_version="2.2.3"
new_ee_version="3.0.1"
branch=$1
# Define echo function
@ -34,22 +35,22 @@ function ee_lib_error()
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
if [ "$EE_LINUX_DISTRO" == "Ubuntu" ]; then
apt-get -y install python-software-properties software-properties-common python3 python3-apt python3-setuptools python3-dev sqlite3 git || ee_lib_error "Unable to install pre depedencies, exit status " 1
elif [ "$EE_LINUX_DISTRO" == "Debian" ]; then
apt-get -y install graphviz python-software-properties python3 python3-apt python3-setuptools python3-dev sqlite3 git || ee_lib_error "Unable to pre depedencies, exit status " 1
fi
# Generating Locale
locale-gen en &>> /dev/null
}
function sync_db()
{
mkdir /var/lib/ee
mkdir -p /var/lib/ee
# Sqlite query to create table `sites` into ee.db which will be used by ee.3.0
echo "CREATE TABLE sites (
@ -152,7 +153,7 @@ function install_ee3()
rm -rf /tmp/easyengine &>> /dev/null
# Clone EE 3.0 Python branch
ee_lib_echo "Cloning EasyEngine 3.0"
ee_lib_echo "Cloning EasyEngine 3"
if [ "$branch" = "" ]; then
branch=stable
fi
@ -160,7 +161,7 @@ function install_ee3()
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"
ee_lib_echo "Installing EasyEngine 3"
python3 setup.py install || ee_lib_error "Unable to install EasyEngine 3.0, exit status " 1
}
@ -168,7 +169,11 @@ function install_ee3()
function update_to_ee3()
{
# Preserve old configuration
ee_lib_echo "Updating EasyEngine 3.0 configuration"
ee_lib_echo "Updating EasyEngine 3 configuration"
if [ -f /etc/nginx/nginx.conf ]; then
sed -i "s/X-Powered-By.*/X-Powered-By \"EasyEngine $new_ee_version\";/" /etc/nginx/nginx.conf &>> /dev/null
fi
grant_host=$(grep grant-host /etc/easyengine/ee.conf | awk '{ print $3 }')
db_name=$(grep db-name /etc/easyengine/ee.conf | awk '{ print $3 }')
@ -194,13 +199,31 @@ function update_to_ee3()
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
ln -s /usr/local/bin/ee /usr/local/sbin/ee || ee_lib_error "Unable to create softlink to old EasyEngine, exit status " 1
}
function update_to_ee_latest()
{
ee_lib_echo "Updating Nginx configuration"
if [ -f /etc/nginx/ee-nginx.conf ]; then
sed -i "s/X-Powered-By.*/X-Powered-By \"EasyEngine $new_ee_version\";/" /etc/nginx/nginx.conf &>> /dev/null
elif [ -f /etc/nginx/nginx.conf ]; then
sed -i "s/X-Powered-By.*/X-Powered-By \"EasyEngine $new_ee_version\";/" /etc/nginx/nginx.conf &>> /dev/null
fi
}
function git_init()
{
# Do git intialisation on EasyEngine configuration
# Do git intialisation on EasyEngine adn Nginx configuration
if [ -d /etc/nginx ];then
cd /etc/nginx
if [ ! -d /etc/nginx/.git ]; then
git init > /dev/null
fi
git add .
git commit -am "Updated Nginx" > /dev/null
fi
cd /etc/ee
if [ ! -d /etc/ee/.git ]; then
git init > /dev/null
@ -217,28 +240,85 @@ if [[ $EUID -ne 0 ]]; then
exit 1
fi
# Execute: apt-get update
ee_lib_echo "Executing apt-get update"
apt-get update &>> /dev/null
# Checking lsb_release package
if [ ! -x /usr/bin/lsb_release ]; then
ee_lib_echo "Installing lsb-release, please wait..."
apt-get -y install lsb-release &>> /dev/null
fi
# Define variables for later use
readonly EE_LOG_DIR=/var/log/ee/
readonly EE_INSTALL_LOG=/var/log/ee/install.log
readonly EE_LINUX_DISTRO=$(lsb_release -i | awk '{print $3}')
readonly EE_DEBIAN_VERSION=$(lsb_release -sc)
# Checking linux distro
if [ "$EE_LINUX_DISTRO" != "Ubuntu" ] && [ "$EE_LINUX_DISTRO" != "Debian" ]; then
ee_lib_echo_fail "EasyEngine (ee) is made for Ubuntu and Debian only as of now"
ee_lib_echo_fail "You are free to fork EasyEngine (ee): https://github.com/rtCamp/easyengine/fork"
ee_lib_echo_fail "EasyEngine (ee) only support Ubuntu 12.04/14.04 and Debian 7.x"
exit 100
fi
# EasyEngine (ee) only support all Ubuntu/Debian distro except the distro reached EOL
lsb_release -d | egrep -e "12.04|14.04|wheezy" &>> /dev/null
if [ "$?" -ne "0" ]; then
exit 100
fi
# Pre checks to avoid later screw ups
# Checking EasyEngine (ee) log directory
if [ ! -d $EE_LOG_DIR ]; then
ee_lib_echo "Creating EasyEngine log directory, please wait..."
mkdir -p $EE_LOG_DIR || ee_lib_error "Creating log directory failed, exit status " 1
# Create EasyEngine log files
touch /var/log/ee/{ee.log,install.log}
# Keep EasyEngine log folder accessible to root only
chmod -R 700 /var/log/ee || ee_lib_error "Unable to setup log directory permissions , exit status " 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
ee_lib_echo "EasyEngine $old_ee_version not found on your system" | tee -ai $EE_INSTALL_LOG
ee_lib_echo "Updating your EasyEngine to $old_ee_version for compability" | tee -ai $EE_INSTALL_LOG
wget -q https://raw.githubusercontent.com/rtCamp/easyengine/old-stable/bin/update && bash update | tee -ai $EE_INSTALL_LOG
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
install_dep | tee -ai $EE_INSTALL_LOG
sync_db | tee -ai $EE_INSTALL_LOG
install_ee3 | tee -ai $EE_INSTALL_LOG
update_to_ee3 | tee -ai $EE_INSTALL_LOG
git_init | tee -ai $EE_INSTALL_LOG
elif [ ! -f /usr/local/bin/ee ]; then
install_dep
install_ee3
git_init
install_dep | tee -ai $EE_INSTALL_LOG
install_ee3 | tee -ai $EE_INSTALL_LOG
git_init | tee -ai $EE_INSTALL_LOG
else
ee_lib_echo_fail "EasyEngine 3 allready installed on your system"
ee -v 2>&1 | grep $new_ee_version &>> /dev/null
if [[ $? -ne 0 ]];then
read -p "Update EasyEngine to $new_ee_version (y/n): " ee_ans
if [ "$ee_ans" = "y" ] || [ "$ee_ans" = "Y" ]; then
install_dep | tee -ai $EE_INSTALL_LOG
update_to_ee_latest | tee -ai $EE_INSTALL_LOG
install_ee3 | tee -ai $EE_INSTALL_LOG
git_init | tee -ai $EE_INSTALL_LOG
service nginx reload &>> /dev/null
fi
else
ee_lib_echo_fail "You allready have EasyEngine $new_ee_version" | tee -ai $EE_INSTALL_LOG
fi
exit 1
fi

Loading…
Cancel
Save