Advertisement
Guest User

Untitled

a guest
Jul 5th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.38 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # coding: utf8
  3.  
  4. # Script to create superset users
  5.  
  6. import pandas as pd
  7. from sqlalchemy import create_engine
  8. import datetime
  9. import pexpect
  10. import os
  11.  
  12. DB = create_engine('mysql+pymysql://superset:superset@localhost/superset')
  13. CSV_USER = 'ext_source/superset_users.csv'
  14. CSV_PASSWORD = 'secrets/email_password.csv'
  15. DOCKER_PATH = '/usr/local/bin' # Useful for Mac
  16.  
  17.  
  18. def main():
  19. create_missing_users()
  20. # reset_all_passwords()
  21.  
  22.  
  23. def create_missing_users():
  24. """ Create users present in csv file but missing in Superset"""
  25. print("== Creating users from csv file, if they do not exist in Superset")
  26. df_existing_users = pd.read_sql_table('ab_user', DB)
  27. df_password_users = pd.read_csv(CSV_PASSWORD, sep=';')
  28.  
  29. df_csv_users = pd.read_csv(CSV_USER, sep=';')
  30. df_csv_users['username'] = concat_username(df_csv_users['first_name'], df_csv_users['last_name'])
  31. now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  32. df_csv_users['now'] = "TIMESTAMP '{}'".format(now)
  33.  
  34. for user_row in df_csv_users.iterrows():
  35. user_dict = user_row[1].to_dict()
  36.  
  37. # Skip existing users
  38. to_insert = True
  39. for key in ['username', 'email']:
  40. if user_dict[key] in df_existing_users[key].values:
  41. print("{} {} already exists in Superset.".format(key, user_dict[key]))
  42. to_insert = False
  43. break
  44.  
  45. # Insert others
  46. if to_insert:
  47. print("Creating user : {first_name}, {last_name}, {username}, {email}".format(**user_dict))
  48. query = """
  49. INSERT INTO ab_user (first_name, last_name, username, active, email, created_on, changed_on, created_by_fk, changed_by_fk, login_count, fail_login_count)
  50. VALUES ('{first_name}', '{last_name}', '{username}', 1, '{email}', {now}, {now}, 1, 1, 0, 0);
  51. """.format(**user_dict)
  52. connection = DB.connect()
  53. connection.execute(query)
  54. connection.close()
  55.  
  56. password = get_corresponding_value(df_password_users, 'email', user_dict['email'], 'password')
  57. if password is None:
  58. print("No password defined for user with email '{email}'. You will have to reset it manually".format(**user_dict))
  59. else:
  60. print("Reset password of user '{username}' with email '{email}'".format(**user_dict))
  61. reset_password(username=user_dict['username'], password=password)
  62.  
  63.  
  64. def concat_username(first_name, last_name):
  65. return first_name + '.' + last_name
  66.  
  67.  
  68. def reset_all_passwords():
  69. """ Reset all passwords from password file"""
  70. print("== Reset all users passwords from secret file")
  71. df_csv_users = pd.read_csv(CSV_USER, sep=';')
  72. df_password_users = pd.read_csv(CSV_PASSWORD, sep=';')
  73.  
  74. for user_row in df_password_users.iterrows():
  75. user_dict = user_row[1].to_dict()
  76. email = user_dict['email']
  77. password = user_dict['password']
  78.  
  79. first_name = get_corresponding_value(df_csv_users, 'email', email, 'first_name')
  80. last_name = get_corresponding_value(df_csv_users, 'email', email, 'last_name')
  81. if first_name is None or last_name is None:
  82. print("No user found for email {} in {}\n".format(email, CSV_USER))
  83. continue
  84. username = concat_username(first_name, last_name)
  85. reset_password(username, password)
  86.  
  87.  
  88. def reset_password(username, password):
  89. """ Reset password of user, by executing fabmanager script in docker
  90. """
  91. env = os.environ.copy()
  92. env['PATH'] = "{}{}{}".format(DOCKER_PATH, os.pathsep, env['PATH'])
  93. child = pexpect.spawnu(
  94. """docker exec -ti superset sh -c \"fabmanager reset-password --username {} --app superset\"""".format(username),
  95. env=env,
  96. timeout=3)
  97. child.expect('Password:')
  98. child.sendline(password)
  99. child.expect('Repeat for confirmation:')
  100. child.sendline(password)
  101.  
  102.  
  103. def get_corresponding_value(df, column_to_equal, value, column_to_get='id'):
  104. """ Get corresponding value in column_to_get, for column_to_equal == value
  105.  
  106. Suppose that only one row match column_to_equal == value
  107. """
  108. ids = list(df[df[column_to_equal] == value][column_to_get])
  109. if ids:
  110. if len(ids) > 1:
  111. raise ValueError("Value {} is present multiple times in columns {}".format(value, column_to_equal))
  112. return ids[0]
  113. else:
  114. return None
  115.  
  116. if __name__ == "__main__":
  117. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement