~gz/juju-ci-tools/repository_windows_charms

« back to all changes in this revision

Viewing changes to vivid/mysql/hooks/common.py

  • Committer: Curtis Hovey
  • Date: 2014-11-18 18:51:33 UTC
  • Revision ID: curtis@canonical.com-20141118185133-tupmay0y05g3a76w
Added vivid.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# vim: syntax=python
 
2
 
 
3
import os
 
4
import sys
 
5
import MySQLdb
 
6
import subprocess
 
7
import uuid
 
8
 
 
9
def get_service_user_file(service):
 
10
    return '/var/lib/mysql/%s.service_user2' % service
 
11
 
 
12
 
 
13
def get_service_user(service):
 
14
    if service == '':
 
15
        return (None, None)
 
16
    sfile = get_service_user_file(service)
 
17
    if os.path.exists(sfile):
 
18
        with open(sfile, 'r') as f:
 
19
            return (f.readline().strip(), f.readline().strip())
 
20
    (suser, service_password) = subprocess.check_output(['pwgen', '-N 2', '15']).strip().split("\n")
 
21
    with open(sfile, 'w') as f:
 
22
        f.write("%s\n" % suser)
 
23
        f.write("%s\n" % service_password)
 
24
        f.flush()
 
25
    return (suser, service_password)
 
26
 
 
27
 
 
28
def cleanup_service_user(service):
 
29
    os.unlink(get_service_user_file(service))
 
30
 
 
31
 
 
32
relation_id = os.environ.get('JUJU_RELATION_ID')
 
33
change_unit = os.environ.get('JUJU_REMOTE_UNIT')
 
34
 
 
35
# We'll name the database the same as the service.
 
36
database_name_file = '.%s_database_name' % (relation_id)
 
37
# change_unit will be None on broken hooks
 
38
database_name = ''
 
39
if change_unit:
 
40
    database_name, _ = change_unit.split("/")
 
41
    with open(database_name_file, 'w') as dbnf:
 
42
        dbnf.write("%s\n" % database_name)
 
43
        dbnf.flush()
 
44
elif os.path.exists(database_name_file):
 
45
    with open(database_name_file, 'r') as dbname:
 
46
        database_name = dbname.readline().strip()
 
47
else:
 
48
    print 'No established database and no REMOTE_UNIT.'
 
49
# A user per service unit so we can deny access quickly
 
50
user, service_password = get_service_user(database_name)
 
51
connection = None
 
52
lastrun_path = '/var/lib/juju/%s.%s.lastrun' % (database_name,user)
 
53
slave_configured_path = '/var/lib/juju.slave.configured.for.%s' % database_name
 
54
slave_configured = os.path.exists(slave_configured_path)
 
55
slave = os.path.exists('/var/lib/juju/i.am.a.slave')
 
56
broken_path = '/var/lib/juju/%s.mysql.broken' % database_name
 
57
broken = os.path.exists(broken_path)
 
58
 
 
59
def get_db_cursor():
 
60
    # Connect to mysql
 
61
    passwd = open("/var/lib/mysql/mysql.passwd").read().strip()
 
62
    connection = MySQLdb.connect(user="root", host="localhost", passwd=passwd)
 
63
    return connection.cursor()
 
64
 
 
65
 
 
66
def database_exists(db_name):
 
67
    cursor = get_db_cursor()
 
68
    try:
 
69
        cursor.execute("SHOW DATABASES")
 
70
        databases = [i[0] for i in cursor.fetchall()]
 
71
    finally:
 
72
        cursor.close()
 
73
    return db_name in databases
 
74
 
 
75
 
 
76
def create_database(db_name):
 
77
    cursor = get_db_cursor()
 
78
    try:
 
79
        cursor.execute("CREATE DATABASE {}".format(db_name))
 
80
    finally:
 
81
        cursor.close()
 
82
 
 
83
 
 
84
def grant_exists(db_name, db_user, remote_ip):
 
85
    cursor = get_db_cursor()
 
86
    try:
 
87
        cursor.execute("SHOW GRANTS for '{}'@'{}'".format(db_user,
 
88
                                                          remote_ip))
 
89
        grants = [i[0] for i in cursor.fetchall()]
 
90
    except MySQLdb.OperationalError:
 
91
        print "No grants found"
 
92
        return False
 
93
    finally:
 
94
        cursor.close()
 
95
    return "GRANT ALL PRIVILEGES ON `{}`".format(db_name) in grants
 
96
 
 
97
 
 
98
def create_grant(db_name, db_user,
 
99
                 remote_ip, password):
 
100
    cursor = get_db_cursor()
 
101
    try:
 
102
        cursor.execute("GRANT ALL PRIVILEGES ON {}.* TO '{}'@'{}' "\
 
103
                       "IDENTIFIED BY '{}'".format(db_name,
 
104
                                                   db_user,
 
105
                                                   remote_ip,
 
106
                                                   password))
 
107
    finally:
 
108
        cursor.close()
 
109
 
 
110
 
 
111
def cleanup_grant(db_user,
 
112
                  remote_ip):
 
113
    cursor = get_db_cursor()
 
114
    try:
 
115
        cursor.execute("DROP FROM mysql.user WHERE user='{}' "\
 
116
                       "AND HOST='{}'".format(db_user,
 
117
                                              remote_ip))
 
118
    finally:
 
119
        cursor.close()