"""Run on BR-SRV: CSV import using the supported samba-tool command line.""" import csv import subprocess from pathlib import Path def samba(*args, capture=False): return subprocess.run(['samba-tool', *args], check=True, text=True, stdout=subprocess.PIPE if capture else subprocess.DEVNULL) with Path('/mnt/additional/Users.csv').open(encoding='cp1252', newline='') as f: rows = list(csv.DictReader(f, delimiter=';')) assert len(rows) == 300 logins = [(r['First Name'] + '.' + r['Last Name']).lower() for r in rows] assert len(set(logins)) == len(logins) ous = samba('ou', 'list', capture=True).stdout for ou in sorted({r['OU'] for r in rows}): if f'OU={ou}' not in ous.splitlines(): samba('ou', 'create', f'OU={ou},DC=au-team,DC=irpo') existing = set(samba('user', 'list', capture=True).stdout.splitlines()) for number, (row, login) in enumerate(zip(rows, logins), 1): if login not in existing: samba('user', 'create', login, row['Password'], '--use-username-as-cn', '--userou=OU=' + row['OU'], '--given-name=' + row['First Name'], '--surname=' + row['Last Name'], '--job-title=' + row['Role'], '--telephone-number=' + row['Phone']) # ldbmodify receives UTF-8 attributes encoded as base64 LDIF values. import base64 dn = f"CN={login},OU={row['OU']},DC=au-team,DC=irpo" lines = [f'dn: {dn}', 'changetype: modify'] for attr, value in {'streetAddress': row['Street'], 'postalCode': row['ZIP/Postal Code'], 'l': row['City'], 'co': row['Country/Region'], 'c': 'RU', 'countryCode': '643'}.items(): lines += [f'replace: {attr}', f'{attr}:: {base64.b64encode(value.encode()).decode()}', '-'] subprocess.run(['ldbmodify', '-H', '/var/lib/samba/private/sam.ldb'], input='\n'.join(lines)+'\n', text=True, check=True, stdout=subprocess.DEVNULL) if number % 50 == 0: print(f'Imported {number}/300', flush=True) print('Imported 300 users with passwords and CSV attributes')