|
|
|
"""EasyEngine MySQL core classes."""
|
|
|
|
import pymysql
|
|
|
|
import configparser
|
|
|
|
from os.path import expanduser
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
from ee.core.logging import Log
|
|
|
|
from ee.core.variables import EEVariables
|
|
|
|
|
|
|
|
|
|
|
|
class EEMysql():
|
|
|
|
"""Method for MySQL connection"""
|
|
|
|
|
|
|
|
def execute(self, statement, errormsg='', log=True):
|
|
|
|
"""Get login details from ~/.my.cnf & Execute MySQL query"""
|
|
|
|
config = configparser.RawConfigParser()
|
|
|
|
cnfpath = expanduser("~")+"/.my.cnf"
|
|
|
|
if [cnfpath] == config.read(cnfpath):
|
|
|
|
user = config.get('client', 'user')
|
|
|
|
passwd = config.get('client', 'password')
|
|
|
|
try:
|
|
|
|
host = config.get('client', 'host')
|
|
|
|
except configparser.NoOptionError as e:
|
|
|
|
host = 'localhost'
|
|
|
|
|
|
|
|
try:
|
|
|
|
port = config.get('client', 'port')
|
|
|
|
except configparser.NoOptionError as e:
|
|
|
|
port = '3306'
|
|
|
|
|
|
|
|
try:
|
|
|
|
conn = pymysql.connect(host=host, port=int(port),
|
|
|
|
user=user, passwd=passwd)
|
|
|
|
cur = conn.cursor()
|
|
|
|
except Exception as e:
|
|
|
|
if errormsg:
|
|
|
|
Log.debug(self, '{0}'
|
|
|
|
.format(e))
|
|
|
|
Log.error(self, '{0}'
|
|
|
|
.format(errormsg))
|
|
|
|
else:
|
|
|
|
Log.debug(self, '{0}'
|
|
|
|
.format(e))
|
|
|
|
Log.error(self, 'Unable to connect to database: {0}'
|
|
|
|
.format(e))
|
|
|
|
|
|
|
|
try:
|
|
|
|
if log:
|
|
|
|
Log.debug(self, "Executing MySQL statement: {0}"
|
|
|
|
.format(statement))
|
|
|
|
|
|
|
|
cur.execute(statement)
|
|
|
|
cur.close()
|
|
|
|
conn.close()
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
cur.close()
|
|
|
|
conn.close()
|
|
|
|
Log.debug(self, "{0}".format(e))
|
|
|
|
if not errormsg:
|
|
|
|
Log.error(self, 'Unable to execute statement')
|
|
|
|
else:
|
|
|
|
Log.error(self, '{0}'.format(errormsg))
|
|
|
|
|
|
|
|
def backupAll(self):
|
|
|
|
import subprocess
|
|
|
|
try:
|
|
|
|
Log.info(self, "Backing up database at location: "
|
|
|
|
"/var/ee-mysqlbackup")
|
|
|
|
# Setup Nginx common directory
|
|
|
|
if not os.path.exists('/var/ee-mysqlbackup'):
|
|
|
|
Log.debug(self, 'Creating directory'
|
|
|
|
'/var/ee-mysqlbackup')
|
|
|
|
os.makedirs('/var/ee-mysqlbackup')
|
|
|
|
|
|
|
|
db = subprocess.check_output(["mysql -Bse \'show databases\'"],
|
|
|
|
universal_newlines=True,
|
|
|
|
shell=True).split('\n')
|
|
|
|
for dbs in db:
|
|
|
|
if dbs == "":
|
|
|
|
continue
|
|
|
|
Log.info(self, "Backing up {0} database".format(dbs))
|
|
|
|
p1 = subprocess.Popen("mysqldump {0}"
|
|
|
|
" --max_allowed_packet=1024M"
|
|
|
|
" --single-transaction".format(dbs),
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
stderr=subprocess.PIPE, shell=True)
|
|
|
|
p2 = subprocess.Popen("gzip -c > /var/ee-mysqlbackup/{0}{1}.s"
|
|
|
|
"ql.gz".format(dbs, EEVariables.ee_date),
|
|
|
|
stdin=p1.stdout,
|
|
|
|
shell=True)
|
|
|
|
|
|
|
|
# Allow p1 to receive a SIGPIPE if p2 exits
|
|
|
|
p1.stdout.close()
|
|
|
|
output = p1.stderr.read()
|
|
|
|
|
|
|
|
if output == b'':
|
|
|
|
Log.debug(self, "done")
|
|
|
|
else:
|
|
|
|
Log.error(self, output)
|
|
|
|
except Exception as e:
|
|
|
|
Log.error(self, "Error: process exited with status %s"
|
|
|
|
% e)
|