def gen(i, param): pwo = PasswordGenerator() if param == "U": return pwo.shuffle_password('ABCDEFGHIJKLMNOPQRSTUVWXYZ', i) elif param == "L": return pwo.shuffle_password('abcdefghijklmnopqrstuvwxyz', i) elif param == "D": return pwo.shuffle_password('1234567890', i) elif param == "LD" or "DL": return pwo.shuffle_password('abcdefghijklmnopqrstuvwxyz1234567890', i) elif param == "UD" or "DU": return pwo.shuffle_password('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890', i) elif param == "UL" or "LU": return pwo.shuffle_password('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', i) else: return pwo.shuffle_password("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", i)
class CreateJsonTemplates(object): """Class creates templates for passing to GOOGLE API""" def __init__(self, argv, groups, cond_groups, dyn_groups, domen, dc_ou): self.__domen = domen self.__dc_ou = dc_ou self.__email_validator = EmailValidator() self.__json_file = argv self.__groups = groups self.__cond_groups = cond_groups self.__dyn_groups = dyn_groups self.__pg = PasswordGenerator() self.__chars = 'abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' self.__data = list() self.__list_cond_groups = list() self.__list_dyn_groups = list() self.__parsed_names_list = list() self.__transliteration_names_list = list() self.__email_adresses_list = list() self.__consolidated_list = list() self.__list_templates_add_users = list() self.__list_templates_update_users = list() self.__list_templates_suspend_users = list() self.__list_templates_adding_groups = list() self.__list_templates_for_ldap = list() with open(self.__json_file, "r", encoding='utf-8') as temp_json_file: self.__json_temp = load(temp_json_file) self.__json_enum = len(self.__json_temp["name"]) for index_num in range(self.__json_enum): self.__data.append(\ [self.__json_temp["name"][index_num], \ self.__json_temp["position"][index_num], \ self.__json_temp["subdivision"][index_num], \ self.__json_temp["parent1"][index_num], \ self.__json_temp["parent2"][index_num], \ self.__json_temp["email"][index_num], \ self.__json_temp["inn"][index_num], \ self.__json_temp["phone"][index_num]]) with open(self.__cond_groups, "r", encoding='utf-8') as cond_groups: temp_list_cond_groups = list() for line in cond_groups: temp_list_cond_groups.append( ("".join(line.split(";"))).replace('\n', '')) for line in temp_list_cond_groups: self.__list_cond_groups.append([line.split(":")[0], \ [sub(r'(^r\')|(\'$)', '', x) for x in line.split(":")[1].split(" , ")]]) with open(self.__dyn_groups, "r", encoding='utf-8') as dyn_groups: temp_list_dyn_groups = list() for line in dyn_groups: temp_list_dyn_groups.append( ("".join(line.split(";"))).replace('\n', '')) for line in temp_list_dyn_groups: self.__list_dyn_groups.append([line.split(' , ')[:3], \ str(line.split(' , ')[3]).split(' : ')]) self.__parse_names() self.__names_transliteration() self.__create_email_adresses() self.__consolidate_data() self.__get_ad_folders() def __parse_names(self): for user_data in self.__data: self.__sub_user_data = sub(r'\(\s?\w+\W?\w+\s?\)', ' ', user_data[0]) if len(self.__sub_user_data.split()) == 3: self.__parsed_names_list.append(\ [item.capitalize() for item in self.__sub_user_data.split()]) else: self.__sub_user_data += ' ND' self.__parsed_names_list.append(\ [item.capitalize() for item in self.__sub_user_data.split()]) for index_num, item_data in enumerate(self.__parsed_names_list): if "Nd" in item_data[2]: self.__parsed_names_list[index_num][2] = " " def __names_transliteration(self): self.__transliteration_name = str() self.__transliteration_alphabet = [['а', ('a',)], ['б', ('b',)], ['в', ('v',)], \ ['г', ('h',)], ['ґ', ('g',)], ['д', ('d',)], ['е', ('e',)], ['є', ('ye', 'ie')], \ ['ж', ('zh',)], ['з', ('z',)], ['и', ('y',)], ['і', ('i',)], ['ї', ('yi', 'i')], \ ['й', ('y', 'i')], ['к', ('k',)], ['л', ('l',)], ['м', ('m',)], ['н', ('n',)], \ ['о', ('o',)], ['п', ('p',)], ['р', ('r',)], ['с', ('s',)], ['т', ('t',)], ['у', ('u',)], \ ['ф', ('f',)], ['х', ('kh',)], ['ц', ('ts',)], ['ч', ('ch',)], ['ш', ('sh',)], \ ['щ', ('shch',)], ['ю', ('yu', 'iu')], ['я', ('ya', 'ia')]] for parsed_name in self.__parsed_names_list: for word in parsed_name: for index_num, char in enumerate(word): if index_num == 0: for letter in self.__transliteration_alphabet: if char.lower() == letter[0]: self.__transliteration_name += letter[1][0] elif index_num != 0 and \ char.lower() in \ [letter[0] for letter in self.__transliteration_alphabet if len(letter[1]) > 1]: for letter in self.__transliteration_alphabet: if char == letter[0]: self.__transliteration_name += letter[1][1] else: for letter in self.__transliteration_alphabet: if char == letter[0]: self.__transliteration_name += letter[1][0] self.__transliteration_name += ' ' self.__transliteration_names_list.append(\ self.__transliteration_name.rstrip().split(' ')) self.__transliteration_name = '' for index_num, item_data in enumerate( self.__transliteration_names_list): if len(item_data) < 3: self.__transliteration_names_list[index_num].append(" ") def __create_email_adresses(self): for num, name in enumerate(self.__transliteration_names_list): for type_num in range(3): if type_num == 0: if self.__email_validator.validation(\ name[1] + '.' + name[0] + '@' + self.__domen,self.__data[num][6]) == True \ and len(name[1] + '.' + name[0]) <= 20: self.__email_adresses_list.append(name[1] + '.' + name[0] + '@' + self.__domen) break else: continue elif type_num == 1: if self.__email_validator.validation(\ name[1][0] + '.' + name[0] + '@' + self.__domen,self.__data[num][6]) == True: self.__email_adresses_list.append(name[1][0] + '.' + name[0] + '@' + self.__domen) break else: continue elif type_num == 2: if self.__email_validator.validation(\ name[1][0] + '.' + name[2][0] + '.' + name[0] \ + '@' + self.__domen,self.__data[num][6]) == True: self.__email_adresses_list.append(\ name[1][0] + '.' + name[2][0] + '.' + name[0] + '@' + self.__domen) break else: self.__email_adresses_list.append('Error') break def __consolidate_data(self): ''' [[0-Имя,1-Фамилия,2-Мєйл,3-Должность,4-Департамент\Отдел\Управление,5-Мєйл из файла, 6-ИНН, 7-Телефон],8-Группа,9-Отчество,10-Папка на сервере,11-Организационная единица,] ''' for index_num, item_data in enumerate(self.__data): self.__consolidated_list.append(\ [self.__parsed_names_list[index_num][1], \ self.__parsed_names_list[index_num][0], \ self.__email_adresses_list[index_num], \ item_data[1], \ item_data[4] + ' | ' + item_data[3] + ' | ' + item_data[2], \ item_data[5], \ item_data[6], \ item_data[7]]) #Определение пользователей в группы for index_num, item_data in enumerate(self.__consolidated_list): if len(item_data) == 8: item_data.append([]) for group in self.__list_dyn_groups: for item in item_data[4].split(' | '): for condition in group[1]: if findall(condition, item) != [] and group[0][0] == 'sub': item_data[8].append(sub(r'\{\d\}', \ findall(group[0][2], item)[0], condition)) elif findall(sub(r'(^r\')|(\'$)', '', condition), item_data[3]) != [] \ and findall(r'^\(\w\s?\W\s?\d+\)', item) != [] \ and group[0][0] == 'sub': item_data[8].append(sub(r'\{\d\}', \ findall(sub(r'(^r\')|(\'$)', '', \ group[0][2]), item)[0], group[0][1])) else: pass for group in self.__list_cond_groups: for condition in group[1]: for item in item_data[4].split(' | '): if findall(condition, item) != []: item_data[8].append(group[0]) break else: pass if findall(condition, item_data[3]) != []: item_data[8].append(group[0]) break else: pass if condition == 'default': item_data[8].append(group[0]) break else: pass for index_num, item_data in enumerate(self.__consolidated_list): item_data.append(self.__parsed_names_list[index_num][2]) def __get_ad_folders(self): self.__home_folders = dict() self.__ad_folders = list() with open(path.join(getcwd(), "st_structure.dat"), "r", encoding='utf-8') as f: for line in f: self.__ad_folders.append( (" | ".join(line.split(";"))).replace('\n', '')) with open(path.join(getcwd(), "ha_dict.dat"), "r", encoding='utf-8') as f: for line in f: (key, val) = line[:-1].split(':') self.__home_folders[key] = val for index_num, item_data in enumerate(self.__consolidated_list): for item in item_data[4].split(" | "): if self.__home_folders.get(item, None) is not None: self.__consolidated_list[index_num].append( self.__home_folders[item]) break else: pass if len(item_data) == 10: self.__consolidated_list[index_num].append("ВРЕМЕННЫЕ") for index_num, item_data in enumerate(self.__consolidated_list): for line in self.__ad_folders: if len(line.split(" | ")) == 3: if SequenceMatcher(None, line, item_data[4]).ratio() > 0.95: reverse_line = line.split(" | ") reverse_line.reverse() reverse_line = " | ".join(reverse_line) self.__consolidated_list[index_num].append( reverse_line) break else: pass else: if SequenceMatcher(None, " | ".join( line.split(" | ")[-3:]), item_data[4]).ratio() > 0.95: reverse_line = line.split(" | ") reverse_line.reverse() reverse_line = " | ".join(reverse_line) self.__consolidated_list[index_num].append( reverse_line) break else: pass if len(item_data) == 11: self.__consolidated_list[index_num].append("") def show(self): return self.__consolidated_list def get_data(self, mode): """Class creates templates for passing to GOOGLE API""" if mode == 'addUsers': for item in self.__consolidated_list: if item[5] == "": self.__list_templates_add_users.append({"orgUnitPath" : "/omega", \ "primaryEmail" : "{0}".format(item[2]),\ "password" : "{0}".format(self.__pg.shuffle_password(self.__chars,8)), \ "externalIds": [{"value": "{0}".format(item[6]), \ "type": "organization"}], \ "organizations" : [{"title" : "{0}".format(item[3]),\ "department" : "{0}".format(item[4]),}],\ "name" : {"givenName" : "{0}".format(item[0]),\ "familyName" : "{0}".format(item[1]),},\ "changePasswordAtNextLogin" : True,}) else: self.__list_templates_add_users.append({"orgUnitPath" : "/omega", \ "primaryEmail" : "{0}".format(item[5]),\ "password" : "{0}".format(self.__pg.shuffle_password(self.__chars,8)), \ "externalIds": [{"value": "{0}".format(item[6]), \ "type": "organization"}], \ "organizations" : [{"title" : "{0}".format(item[3]),\ "department" : "{0}".format(item[4]),}],\ "name" : {"givenName" : "{0}".format(item[0]),\ "familyName" : "{0}".format(item[1]),},\ "changePasswordAtNextLogin" : True,}) return self.__list_templates_add_users elif mode == 'updateUsers': for item in self.__consolidated_list: self.__list_templates_update_users.append([item[5], {"name" : \ {"givenName" : "{0}".format(item[0]), \ "familyName" : "{0}".format(item[1]),}, \ "organizations" : \ [{"title" : "{0}".format(item[3]),\ "department" : "{0}".format(item[4]),}],}]) return self.__list_templates_update_users elif mode == 'suspendUsers': for item in self.__consolidated_list: self.__list_templates_suspend_users.append( [item[5], { "suspended": True }]) return self.__list_templates_suspend_users elif mode == 'addGroups': for item in self.__consolidated_list: if item[5] == "": if item is not None: self.__list_templates_adding_groups.append([item[8], \ {"role" : "MEMBER", "type" : "USER", "email" : "{0}".format(item[2])}]) else: if item is not None: self.__list_templates_adding_groups.append([item[8], \ {"role" : "MEMBER", "type" : "USER", "email" : "{0}".format(item[5])}]) return self.__list_templates_adding_groups elif mode == 'ldap': for index_num, item_data in enumerate(self.__consolidated_list): self.__list_templates_for_ldap.append(\ [('cn={0},{1}').format(\ (item_data[1] + " " + item_data[0] + " " + item_data[9]).rstrip(), \ "".join(["ou="+str(x).replace(",", "\5C,")+"," for x in item_data[11].split(" | ")]) + self.__dc_ou \ if item_data[11] != "" else "ou=Заблоковані," + ",".join(self.__dc_ou.split(',')[1:])), \ 'user', {'givenName': "{0}".format(item_data[0]),\ 'sn': "{0}".format(item_data[1]), \ 'displayName': "{0}".format(\ (item_data[1] + " " + item_data[0] + " " + item_data[9]).rstrip()), \ 'userPrincipalName': "{0}".format(\ "".join([x for x in item_data[2].split('@') if x not in self.__domen])), \ 'sAMAccountName': "{0}".format(\ "".join([x for x in item_data[2].split('@') if x not in self.__domen])), \ 'profilePath': "{0}".format("\\\\netomega.corp.local\\services\\profiles\\" + \ "".join([x for x in item_data[2].split('@') if x not in self.__domen])), \ 'scriptPath': "{0}".format("logon.bat"), \ 'company': 'ТОВ "Омега"', \ 'title': "{0}".format(item_data[3]), \ 'department': "{0}".format(item_data[4].split(" | ")[2][:64]), \ 'c': 'UA', \ 'l': 'Дніпро', \ "mail": "{0}".format(item_data[2]), \ "info": "{0}".format("CN=" + (item_data[0] + \ " " + \ item_data[9] + \ " " + \ item_data[1]).rstrip() + \ "/OU=omega/O=rush"), \ "description": "{0}".format(item_data[6]), \ "mobile": "{0}".format(item_data[7])}, \ ('{0}' + self.__dc_ou).format(\ ("".join(["ou="+str(x)+"," for x in item_data[11].split(" | ")]) \ if item_data[11] != "" else "")), \ self.__pg.shuffle_password(self.__chars,8)]) return self.__list_templates_for_ldap else: return None
def create_password(): pwo = PasswordGenerator() return pwo.shuffle_password( '0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN!@#$%^&*()_+-=[]{}|\'', 16)