Source code for nuka.tasks.mysql

# -*- coding: utf-8 -*-
"""
mysql related tasks
"""
import os
import codecs
import getpass

from nuka import utils
from nuka.task import Task


[docs]class my_cnf(Task): """create ~/.my.cnf""" def __init__(self, password=None, switch_user='root', **kwargs): kwargs['name'] = '~{0}/.my.cnf'.format(switch_user) super(my_cnf, self).__init__(switch_user=switch_user, password=password, **kwargs) def do(self): self.args['user'] = getpass.getuser() dst = os.path.expanduser('~/.my.cnf') old_data = '' if os.path.isfile(dst): with codecs.open(dst, 'r', 'utf8') as fd: old_data = fd.read() data = ( '[client]\n' 'user={user}\n' 'password={password}\n').format(**self.args) changed = old_data != data if changed: with codecs.open(dst, 'w', 'utf8') as fd: fd.write(data) utils.chmod(dst, '600') self.args.pop('password') return dict(rc=0, changed=changed, dst=dst) def diff(self): self.args['user'] = getpass.getuser() dst = os.path.expanduser('~/.my.cnf') old_data = '' if os.path.isfile(dst): with codecs.open(dst, 'r', 'utf8') as fd: old_data = fd.read() data = ( '[client]\n' 'user={user}\n' 'password={password}\n').format(**self.args) diff = self.texts_diff(old_data, data, fromfile=dst) return dict(rc=0, diff=diff)
[docs]class set_root_password(my_cnf): """set mysql root password and store it in ~/.my.cnf""" def __init__(self, password=None, **kwargs): kwargs.update(password=password, switch_user='root') super(set_root_password, self).__init__(**kwargs) def do(self): new_password = self.args['password'] old_password = None # get old password dst = os.path.expanduser('/root/.my.cnf') if os.path.isfile(dst): with codecs.open(dst, 'r', 'utf8') as fd: for line in fd: line = line.strip() if line.startswith('password'): old_password = line.split('=')[1].strip() if old_password != new_password: # change password cmd = ['mysqladmin', 'password', new_password] if old_password: cmd[1:1] = ['--password=' + old_password] self.sh(cmd) # forward to my_cnf to update /root/.my.cnf return super(set_root_password, self).do()
[docs]class create_db(Task): """create a database and grant user""" statement = ''' CREATE DATABASE IF NOT EXISTS {name}; GRANT ALL PRIVILEGES ON *.* TO '{user}'@'%' IDENTIFIED BY '{password}'; FLUSH PRIVILEGES; ''' def __init__(self, name=None, user=None, password=None, **kwargs): super(create_db, self).__init__(name=name, user=user, password=password, **kwargs) def do(self): return self.sh('mysql', stdin=self.statement.format(**self.args))
[docs]class execute(Task): """execute a sql statement""" diff = False def __init__(self, sql=None, **kwargs): kwargs.setdefault('name', sql) super(execute, self).__init__(sql=sql, **kwargs) def do(self): return self.sh('mysql', stdin=self.args['sql'])