wadebug/wa_actions/implementations/check_mysql_permissions.py (55 lines of code) (raw):
# Copyright (c) Facebook, Inc. and its affiliates.
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from __future__ import absolute_import, division, print_function, unicode_literals
from wadebug import results
from wadebug.wa_actions.base import WAAction
from wadebug.wa_actions.mysql_utils import MySQLUtil
PRIVILEGES = [
"Select_priv",
"Insert_priv",
"Update_priv",
"Delete_priv",
"Create_priv",
"Alter_priv",
"Index_priv",
"Drop_priv",
]
SUCCESS = "Y"
class CheckMySQLPermissions(WAAction):
user_facing_name = "check_mysql_permissions"
short_description = (
"Test if the database have permissions to create database or tables"
)
config_dependencies = ("db.host", "db.port", "db.user", "db.password")
@classmethod
def _run(cls, config, *args, **kwargs):
db_config = config.get("db")
cur_user = db_config.get("user")
errors = []
remediation = """
Run MySQL command:
GRANT ALL PRIVILEGES ON *.* TO \'{}\'@\'{}\'
to grant all privileges to the db user `{}` and rerun the checks.
""".format(
cur_user, db_config.get("host"), cur_user
)
try:
mysql_utils = MySQLUtil(**db_config)
result = mysql_utils.user_has_privileges(cur_user, PRIVILEGES)
if not result:
return results.Problem(
cls,
"Checking permissions returns empty result",
"User {} doesn't exist".format(cur_user),
"Make sure the correct db user is set in the config file",
)
for col in PRIVILEGES:
if result[col] != SUCCESS:
errors.append(col)
except Exception as e:
return results.Problem(
cls, "Unable to connect to db to check permisions", e, remediation
)
if errors:
return results.Problem(
cls,
"Some required db permisions are missing",
"Missing Permissions : {}".format(" , ".join(errors)),
remediation,
)
return results.OK(cls)