Skip to content

Commit

Permalink
import_users: PEP8, allow optional password via -p flag. Fix an issue
Browse files Browse the repository at this point in the history
with trailing semicolon. Give more helpful warning if mysql-python
package is missing.
  • Loading branch information
tony committed Mar 19, 2015
1 parent bc2d65b commit a58db1f
Showing 1 changed file with 75 additions and 51 deletions.
126 changes: 75 additions & 51 deletions import_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,77 +2,101 @@
"This script helps you to get mysql.user pillar from existent mysql server"

import argparse
import MySQLdb
import re

try:
import MySQLdb
except ImportError:
raise Exception("MySQLdb not found. Install MySQL-python package.")

__author__ = "Egor Potiomkin"
__version__ = "1.0"
__email__ = "eg13reg@gmail.com"

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

# PARSE GRANTS
mysqlcon = MySQLdb.connect(host=args.host,user=args.user,passwd=args.password,db="mysql",use_unicode=True, charset='utf8')
# PARSE GRANTS
connection_config = {
"host": args.host,
"user": args.user,
"db": "mysql",
"use_unicode": True,
"charset": 'utf8'
}

if args.password: # some mysql environments (developer ones) use no password
connection_config['passwd'] = args.password

mysqlcon = MySQLdb.connect(
**connection_config
)
mysqlCur = mysqlcon.cursor(MySQLdb.cursors.DictCursor)

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

for row in rows:
users.append({'name': row['user'], 'host': row['host']});
users.append({'name': row['user'], 'host': row['host']})

mysqlCur = mysqlcon.cursor()
grants = []
for user in users:
q = r'''show grants for '%s'@'%s';''' % (user['name'], user['host'])
try:
user['grants'] = []
mysqlCur.execute(q)
rows = mysqlCur.fetchall()
for row in rows:
mpass = re.search(
r"""GRANT USAGE ON \*\.\* TO .* IDENTIFIED BY PASSWORD '(\*[A-F0-9]*)\'""",
row[0])
if mpass is None:
mgrant = re.search(
r"""GRANT ([\s,A-Z]+) ON `?([a-zA-Z0-9_\-*\\]*)`?\.`?([a-zA-Z0-9_\-*\\]*)`? TO .*""",
row[0])
if mgrant is not None:
user['grants'].append({'grant': [x.strip() for x in mgrant.group(1).split(',')], 'database': mgrant.group(2).replace('\\',''), 'table': mgrant.group(3).replace('\\','')})
else:
print "ERROR: CAN NOT PARSE GRANTS: ",row[0]
else:
user['password'] = mpass.group(1)
q = r'''show grants for '%s'@'%s';''' % (user['name'], user['host'])
try:
user['grants'] = []
mysqlCur.execute(q)
rows = mysqlCur.fetchall()
for row in rows:
mpass = re.search(
r"""GRANT USAGE ON \*\.\* TO .* IDENTIFIED BY PASSWORD '(\*[A-F0-9]*)\'""",
row[0])
if mpass is None:
mgrant = re.search(
r"""GRANT ([\s,A-Z_]+) ON `?([a-zA-Z0-9_\-*\\]*)`?\.`?([a-zA-Z0-9_\-*\\]*)`? TO .*""",
row[0])
if mgrant is not None:
user['grants'].append(
{
'grant': [x.strip() for x in mgrant.group(1).split(',')],
'database': mgrant.group(2).replace('\\', ''),
'table': mgrant.group(3).replace('\\', '')
}
)
else:
print("ERROR: CAN NOT PARSE GRANTS: ", row[0])
else:
user['password'] = mpass.group(1)

except MySQLdb.DatabaseError:
print "Error while getting grants for '%s'@'%s'" % (user['name'], user['host'])
#raise SystemExit
# PRINT RESULT
""" PRINT EXAMPLE
mysql:
user:
username:
host: host
password_hash: '*2792A97371B2D17789364A22A9B35D180166571A'
databases:
- database: testbase
table: table1
grants: ['select']
"""
print "mysql:"
print " user:"
for user in users:
print " %s:" % user['name']
print " host: '%s'" % user['host']
if ('password' in user):
print " password_hash: '%s'" % user['password']
print " databases:"
for grant in user['grants']:
print " - database: '%s'" % grant['database']
print " table: '%s'" % grant['table']
print " grants: ['%s']" % "','".join(grant['grant']).lower()
except MySQLdb.DatabaseError:
print(
"Error while getting grants for '%s'@'%s'" % (user['name'], user['host'])
)

""" PRINT EXAMPLE
mysql:
user:
username:
host: host
password_hash: '*2792A97371B2D17789364A22A9B35D180166571A'
databases:
- database: testbase
table: table1
grants: ['select']
"""
print("mysql:")
print(" user:")
for user in users:
print(" %s:" % user['name'])
print(" host: '%s'" % user['host'])
if ('password' in user):
print(" password_hash: '%s'" % user['password'])
print(" databases:")
for grant in user['grants']:
print(" - database: '%s'" % grant['database'])
print(" table: '%s'" % grant['table'])
print(" grants: ['%s']" % "','".join(grant['grant']).lower())

0 comments on commit a58db1f

Please sign in to comment.