Skip to content

Commit a58db1f

Browse files
committed
import_users: PEP8, allow optional password via -p flag. Fix an issue
with trailing semicolon. Give more helpful warning if mysql-python package is missing.
1 parent bc2d65b commit a58db1f

File tree

1 file changed

+75
-51
lines changed

1 file changed

+75
-51
lines changed

Diff for: import_users.py

+75-51
Original file line numberDiff line numberDiff line change
@@ -2,77 +2,101 @@
22
"This script helps you to get mysql.user pillar from existent mysql server"
33

44
import argparse
5-
import MySQLdb
65
import re
76

7+
try:
8+
import MySQLdb
9+
except ImportError:
10+
raise Exception("MySQLdb not found. Install MySQL-python package.")
11+
812
__author__ = "Egor Potiomkin"
913
__version__ = "1.0"
1014
__email__ = "[email protected]"
1115

1216
parser = argparse.ArgumentParser()
1317
parser.add_argument('host', metavar='IP', help='host where you want to get users')
1418
parser.add_argument('user', metavar='user', help='mysql user that can show grants')
15-
parser.add_argument('password', metavar='password', help='user password')
19+
parser.add_argument('-p', '--password', metavar='password', help='user password', required=False, default=None)
1620
args = parser.parse_args()
1721

18-
# PARSE GRANTS
19-
mysqlcon = MySQLdb.connect(host=args.host,user=args.user,passwd=args.password,db="mysql",use_unicode=True, charset='utf8')
22+
# PARSE GRANTS
23+
connection_config = {
24+
"host": args.host,
25+
"user": args.user,
26+
"db": "mysql",
27+
"use_unicode": True,
28+
"charset": 'utf8'
29+
}
30+
31+
if args.password: # some mysql environments (developer ones) use no password
32+
connection_config['passwd'] = args.password
33+
34+
mysqlcon = MySQLdb.connect(
35+
**connection_config
36+
)
2037
mysqlCur = mysqlcon.cursor(MySQLdb.cursors.DictCursor)
2138

2239
mysqlCur.execute(r'''select user,host from mysql.user;''')
2340
rows = mysqlCur.fetchall()
2441
users = []
2542

2643
for row in rows:
27-
users.append({'name': row['user'], 'host': row['host']});
44+
users.append({'name': row['user'], 'host': row['host']})
2845

2946
mysqlCur = mysqlcon.cursor()
3047
grants = []
3148
for user in users:
32-
q = r'''show grants for '%s'@'%s';''' % (user['name'], user['host'])
33-
try:
34-
user['grants'] = []
35-
mysqlCur.execute(q)
36-
rows = mysqlCur.fetchall()
37-
for row in rows:
38-
mpass = re.search(
39-
r"""GRANT USAGE ON \*\.\* TO .* IDENTIFIED BY PASSWORD '(\*[A-F0-9]*)\'""",
40-
row[0])
41-
if mpass is None:
42-
mgrant = re.search(
43-
r"""GRANT ([\s,A-Z]+) ON `?([a-zA-Z0-9_\-*\\]*)`?\.`?([a-zA-Z0-9_\-*\\]*)`? TO .*""",
44-
row[0])
45-
if mgrant is not None:
46-
user['grants'].append({'grant': [x.strip() for x in mgrant.group(1).split(',')], 'database': mgrant.group(2).replace('\\',''), 'table': mgrant.group(3).replace('\\','')})
47-
else:
48-
print "ERROR: CAN NOT PARSE GRANTS: ",row[0]
49-
else:
50-
user['password'] = mpass.group(1)
49+
q = r'''show grants for '%s'@'%s';''' % (user['name'], user['host'])
50+
try:
51+
user['grants'] = []
52+
mysqlCur.execute(q)
53+
rows = mysqlCur.fetchall()
54+
for row in rows:
55+
mpass = re.search(
56+
r"""GRANT USAGE ON \*\.\* TO .* IDENTIFIED BY PASSWORD '(\*[A-F0-9]*)\'""",
57+
row[0])
58+
if mpass is None:
59+
mgrant = re.search(
60+
r"""GRANT ([\s,A-Z_]+) ON `?([a-zA-Z0-9_\-*\\]*)`?\.`?([a-zA-Z0-9_\-*\\]*)`? TO .*""",
61+
row[0])
62+
if mgrant is not None:
63+
user['grants'].append(
64+
{
65+
'grant': [x.strip() for x in mgrant.group(1).split(',')],
66+
'database': mgrant.group(2).replace('\\', ''),
67+
'table': mgrant.group(3).replace('\\', '')
68+
}
69+
)
70+
else:
71+
print("ERROR: CAN NOT PARSE GRANTS: ", row[0])
72+
else:
73+
user['password'] = mpass.group(1)
5174

52-
except MySQLdb.DatabaseError:
53-
print "Error while getting grants for '%s'@'%s'" % (user['name'], user['host'])
54-
#raise SystemExit
55-
# PRINT RESULT
56-
""" PRINT EXAMPLE
57-
mysql:
58-
user:
59-
username:
60-
host: host
61-
password_hash: '*2792A97371B2D17789364A22A9B35D180166571A'
62-
databases:
63-
- database: testbase
64-
table: table1
65-
grants: ['select']
66-
"""
67-
print "mysql:"
68-
print " user:"
69-
for user in users:
70-
print " %s:" % user['name']
71-
print " host: '%s'" % user['host']
72-
if ('password' in user):
73-
print " password_hash: '%s'" % user['password']
74-
print " databases:"
75-
for grant in user['grants']:
76-
print " - database: '%s'" % grant['database']
77-
print " table: '%s'" % grant['table']
78-
print " grants: ['%s']" % "','".join(grant['grant']).lower()
75+
except MySQLdb.DatabaseError:
76+
print(
77+
"Error while getting grants for '%s'@'%s'" % (user['name'], user['host'])
78+
)
79+
80+
""" PRINT EXAMPLE
81+
mysql:
82+
user:
83+
username:
84+
host: host
85+
password_hash: '*2792A97371B2D17789364A22A9B35D180166571A'
86+
databases:
87+
- database: testbase
88+
table: table1
89+
grants: ['select']
90+
"""
91+
print("mysql:")
92+
print(" user:")
93+
for user in users:
94+
print(" %s:" % user['name'])
95+
print(" host: '%s'" % user['host'])
96+
if ('password' in user):
97+
print(" password_hash: '%s'" % user['password'])
98+
print(" databases:")
99+
for grant in user['grants']:
100+
print(" - database: '%s'" % grant['database'])
101+
print(" table: '%s'" % grant['table'])
102+
print(" grants: ['%s']" % "','".join(grant['grant']).lower())

0 commit comments

Comments
 (0)